【发布时间】:2016-10-05 13:22:57
【问题描述】:
TLDR:坚持https://code.google.com/archive/p/byte-unixbench/issues/1
尝试使用subprocess.popen() 运行 UnixBench,同时捕获输出并实时打印出来。
这是我想出的子程序:
def run_and_print(command, cwd=None, catch_stderr = False):
if catch_stderr:
err_pipe = subprocess.PIPE
else:
err_pipe = subprocess.STDOUT
p = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=1, cwd=cwd, stderr=err_pipe)
r = ''
while True:
if catch_stderr:
out = p.stderr.read(1)
else:
out = p.stdout.read(1)
if out == "" and p.poll() != None:
break
sys.stdout.write(out)
sys.stdout.flush()
r += out
return r
它适用于除 UnixBench 之外的所有用途。 Unixbench 过了一会儿就死了:
unixbench = run_and_print(['./Run'])
...
1 x 管道吞吐量 1 2 3 4 5 6 7 8 9 10
1 x 基于管道的上下文切换 1 2 3 4
运行:“基于管道的上下文切换”:slave write failed: Broken pipe;中止
Google 并没有太大帮助。我得到的唯一有意义的结果是 https://code.google.com/archive/p/byte-unixbench/issues/1 并建议创建 java 应用程序的解决方案对我不起作用,因为我需要以尽可能少的依赖项运行脚本。
我会感谢任何解决方案或解决方法。我正在测试的系统是 Ubuntu 14.04.4 x64
【问题讨论】:
-
可能无济于事,但你试过
p.communicate()吗?一种可能的技巧:不要尝试在 Python 中捕获输出;相反,通过将 stderr 和 stdout 重定向到不同的文本文件来运行命令。然后通过 Python 读取这些文件。 -
@FMc 关于写入文件的好主意,如果它被重定向到文件,不确定如何实时打印标准输出。您如何建议使用 p.communicate()?我的理解是,使用
communicate在处理完成之前我不会得到任何输出。感谢您的回复。 -
@user1556912,你的理解是正确的,如果你想立即输出,你不能使用通信。
标签: python subprocess