python:读取可执行文件的stdout,破碎的流

时间:2013-09-23 19:31:46

标签: c++ python stream stdout redirect

我正在尝试从我的python脚本中读取用c ++编写的可执行文件(A)的输出。我在Linux工作。到目前为止,我所知道的唯一方法是通过子流程库

首先我试过

p = Popen(['executable', '-arg_flag1', arg1 ...], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
print "reach here"
stdout_output = p.communicate()[0]
print stdout_output
sys.stdin.read(1)

最终挂断了我的可执行文件(使用99%cpu)和我的脚本:S:S:S 此外,在这里打印。

之后我尝试了:

f = open ("out.txt",  'r+')
command = 'executable -arg_flag1 arg1 ... '
subprocess.call(command,  shell=True, stdout=f)
f.seek(0)
content = f.read()

并且这有效,但我得到一个输出,其中内容结尾的一些字符重复或甚至产生的值超出预期:S

无论如何,有人可以告诉我一个更合适的方法吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

第一种解决方案是最好的。使用shell = True比较慢,并且存在安全问题。

问题是Popen不等待进程完成,因此Python在没有stdout,stdin和stderr的情况下停止进程。导致这个过程疯狂。添加p.wait()应该可以做到这一点!

此外,使用沟通是一种时间的浪费。只需要执行stdout_output = p.stdout.read()。你必须检查自己stdout_output是否包含任何内容,但这仍然比使用communication()[0]更好。