Python wx(Python Card)将子进程输出日志到窗口

1 投票
2 回答
1113 浏览
提问于 2025-04-15 13:14

这里有一些类似的问题相关的讨论,但我想要一个更清晰的答案。我正在用PythonCard构建一个简单的图形界面,目的是包装一个命令行程序。具体来说,这是一个用于一系列ANT任务和其他自定义操作的包装器,方便非开发人员使用。

我想把这个子进程的输出重定向到窗口中的一个文本区域。看起来实现这个的方式是使用subprocess.Popen(command, stdout=subprocess.PIPE),然后把输出加载到一个变量中。

我的问题是,如何实时更新窗口,以显示子进程的输出呢?任何提示都会很有帮助。

谢谢!

2 个回答

1

我也在寻找这个问题的解决办法。结果发现,解决方法其实非常简单:

proc = subprocess.Popen("任意程序", cwd="启动目录", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT )
while True:
txt = proc.stdout.readline()
if not txt: break
txt=txt.replace("\r\n","\n").replace("\r\n","\n").replace("\\","\")
self.components.taStdout.appendText(txt)

1

几乎所有可以被包装的子进程都会缓存它的输出,除非你能让它相信自己实际上是连接到一个终端的——而子进程是做不到这一点的。相反,你可以看看 pexpect 这个工具(在所有支持伪终端的平台上运行良好,也就是除了微软Windows以外的所有平台;在Windows上你可以试试 wexpect,不过我对后者没有经验)。

这些模块会在子进程产生输出的第一时间就把它给你,并努力让模块尽快产生这些输出,而不是缓存起来,所以它们应该能让你实时接收这些输出,并把它们添加到你想要不断更新的文本框中。

撰写回答