我使用subprocess.Popen
创建了一个流程,并获得了stdout
。
我想阅读stdout
中的内容并在另一个帖子中打印出来。
由于我的目的是稍后制作一个交互式程序,我不能使用subprocess.communicate
。
我的基本要求是:一旦子进程输出内容,线程应立即将其打印到屏幕上。
这是代码
import subprocess
import thread
import time
def helper(s):
print "start",time.gmtime()
while True:
print "here"
print s.next()
print "finished",time.gmtime()
thread.start_new_thread(helper,(out_stream,))
def process_main():
global stdin_main
global stdout_main
p = subprocess.Popen("/bin/bash", shell=False, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, bufsize=0)
stdin_main = p.stdin
stdout_main = p.stdout
th1 = thread_print_stream(stdout_main)
stdin_main.write("ls -la\n")
stdin_main.flush()
time.sleep(30)
p.terminate()
process_main()
"开始"之间的时间间隔并且"完成"应该非常快。但是它是30秒,与进程终止前的时间完全相同。 我无法理解为什么输出不是实例。 或者我如何才能实现?
答案 0 :(得分:0)
正如cdarke所说。该程序遭受缓冲。 但它更像是python 2.x中的一个bug。 当前程序的逻辑没有错。
要解决此问题,您必须重新打开stdout。 像下面的代码:
def thread_print_stream(out_stream):
def helper(s):
print "start",time.gmtime()
for line in io.open(out_stream.fileno()):
print line
print "finished",time.gmtime()
thread.start_new_thread(helper,(out_stream,))
并添加
stdin_main.close()
stdout_main.close()
在子进程终止之前,确保没有错误上升。