首页 > 解决方案 > 如何将 Python 循环处理信息回显到命令行?

问题描述

我正在尝试设置一个(铁)python 脚本,该脚本向命令行显示一些处理信息。就像是:

list = ["a", "b", "c"]
for i in list:
    cmd /k echo str(list.index(i)) #just echo index and leave window open so user can see progression

挑战是将多个回显命令发送到命令行的同一实例。

注意:我不能只print(i)在这种情况下使用,因为这个 ironpython 脚本将在一个可视化编程应用程序中运行,它不允许打印到命令行。该脚本的目标是用户可以在繁重的操作期间看到进度。

我遇到了多个建议为此使用子进程的线程。我已经看过并测试了很多示例,但我无法让它们中的任何一个起作用。我真的可以使用一些帮助。

例如,当我这样做时......

import subprocess
proc=subprocess.Popen("echo hello world", shell=True, stdout=subprocess.PIPE)

.... 然后我可以看到正在返回“hello world”,所以 echo 可能是成功的。但我从来没有看到一个shell窗口弹出。

编辑 1

更多测试结果:方法1给了我一个很好的结果(命令被执行并且屏幕保持打开以供阅读);方法 2:添加标准输出会打开外壳并保持屏幕打开但没有可见的结果 - 没有什么可读取的;方法3:添加stdin会闪屏(过早关闭)

方法一:

process = Popen("cmd /k dir")

方法2:

process = Popen("cmd /k dir",stdout=subprocess.PIPE)

方法3:

process = Popen('cmd /k dir',stdin=subprocess.PIPE)

编辑 2

方法 4 - 创建两个单独的 cmd 窗口,一个显示 a,一个显示 b。不是。

process = Popen("cmd /k echo a")
process = Popen("cmd /k echo b")

方法 5 - 在 stdin 之后添加 process.stdin.write - 只是闪烁

process = Popen('cmd /k echo a',stdin=subprocess.PIPE)
process.stdin.write("cmd /k echo b")

我正在寻找的东西似乎很简单,但它让我头疼......

标签: pythoncommand-linesubprocessechoironpython

解决方案


你想做的事情并不像你想象的那么简单。因为 CMD 窗口与 IronPython 脚本的进程不同,所以要执行任何交互操作(例如显示脚本的进度),您需要使用某种形式的进程间通信。

例如,您可以编写一个在 CMD 窗口中运行的服务器脚本,然后从 IronPython 脚本向它发送消息。但是接下来您必须担心如何启动服务器、如何停止它以及如何与 IronPython 客户端脚本同步。您可以在此 StackOverflow 答案中看到这种进程间通信的示例。

在尝试这样的事情之前,我会确保没有办法在你的可视化编程应用程序中显示进度,因为留在同一个过程中可能会更容易。


推荐阅读