在进程的运行期间,我想读取它的标准输出并将其写入文件。然而,我的任何尝试都失败了,因为无论我尝试从stdout读取它还是阻止它直到过程结束。
以下是我要做的事情的片段。 (第一部分只是一个将内容写入stdout的python脚本。)
import subprocess
p = subprocess.Popen('python -c \'\
from time import sleep\n\
for i in range(3):\n\
sleep(1)\n\
print "Hello", i\
\'', shell = True, stdout = subprocess.PIPE)
while p.poll() == None:
#read the stdout continuously
pass
print "Done"
我知道有很多问题涉及同一主题。但是,我找到的没有一个能够回答我的问题。
答案 0 :(得分:12)
正在发生的事情是在作者方面缓冲。由于您是从小代码片段中编写这样的小块,因此基础FILE对象将缓冲输出直到结束。以下按预期工作。
#!/usr/bin/python
import sys
import subprocess
p = subprocess.Popen("""python -c '
from time import sleep ; import sys
for i in range(3):
sleep(1)
print "Hello", i
sys.stdout.flush()
'""", shell = True, stdout = subprocess.PIPE)
while True:
inline = p.stdout.readline()
if not inline:
break
sys.stdout.write(inline)
sys.stdout.flush()
print "Done"
但是,你可能不会期待正确的事情。缓冲用于减少系统调用的数量,以使系统更有效。在将文本写入文件之前,将整个文本缓冲到最后是否真的很重要?你还没有得到文件中的所有输出吗?
答案 1 :(得分:5)
以下代码会在子进程运行时逐行打印stdout,直到readline()方法返回一个空字符串:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, ''):
print line
p.stdout.close()
print 'Done'
更好地更新与您的问题相关的内容:
import subprocess
p = subprocess.Popen(['python'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
p.stdin.write("""
from time import sleep ; import sys
for i in range(3):
sleep(1)
print "Hello", i
sys.stdout.flush()
""")
p.stdin.close()
for line in iter(p.stdout.readline, ''):
print line
p.stdout.close()
print 'Done'
答案 2 :(得分:-3)
您可以使用subprocess.communicate()
从stdout获取输出。类似的东西:
while(p.poll() == None):
#read the stdout continuously
print(p.communicate()[0])
pass