有没有办法从这个例子中捕获标准输出?



这是针对Windows环境的。

编译 testprocess.py(使用 pyinstaller(并将生成的 exe 放在测试文件夹中。

在同一文件夹中,运行 ptest.py。

Testprocess.py 开始和永不结束,每 3 秒写入一个数字到 stdout。

ptest.py 尝试捕获此输出。

这段代码模拟了我想解决的生产问题。 与生产中发生的情况类似,在测试过程终止之前,标准输出不会发布到 ptest.py。 在生产中,这个过程永远不会停止,但它会将重要内容发布到 stdout。

有没有办法做到这一点?

只要子进程终止,附加的代码就可以正常工作。

## [testprocess.py]:
import time
x = 0
while True:
print(x)
time.sleep(3)
x += 1

## [ptest.py]:
import os
import sys
import subprocess
def get_script_path():
return os.path.dirname(os.path.realpath(sys.argv[0]))
start_dir = get_script_path()
cmd = [start_dir + os.sep + 'testprocess.exe']
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8', universal_newlines=True)
print('Subprocess started.')
capture = ""
s = proc.stdout.read(1)
print('Read Stdout')
while len(s) > 0:
sys.stdout.write(s)
sys.stdout.flush()
capture += s
s = proc.stdout.read(1)
print(s)
print(capture)
sys.exit()

希望能够在子进程仍在运行时捕获子进程的标准输出,而不是等到它终止。

这是可能的,而且比你想象的要容易。启动子流程后,您可以连续尝试从stdout读取,如果有要打印的内容,则可以打印它。您可能需要修改testprocess.py以刷新自身(向print语句添加flush = True(。

p = subprocess.Popen(command, 
stdout = subprocess.PIPE, 
stderr = subprocess.STDOUT, 
encoding='utf-8', 
universal_newlines=True)
while True:
line = p.stdout.readline()
if line == "" and p.poll() is not None:
break
if line:
print(line.strip(), flush = True)

编辑:如果您的命令看起来像python testprocess.py,您可以跳过将flush = True添加到打印语句中,而是将-u作为命令选项传递。-u告诉 python 解释器以unbuffered模式运行。

但是,我看到您的命令实际上是在调用exe文件。您可能需要弄清楚如何告诉您的编译器如何编译程序作为unbuffered

相关内容

  • 没有找到相关文章

最新更新