繁体   English   中英

Python:如何从另一个进程读取stdout非阻塞?

[英]Python: How to read stdout non blocking from another process?

在进程的运行期间,我想读取它的标准输出并将其写入文件。 然而,我的任何尝试都失败了,因为无论我尝试从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"

我知道有很多问题涉及同一主题。 但是,我找到的没有一个能够回答我的问题。

正在发生的事情是在作家方缓冲。 由于您是从小代码片段中编写这样的小块,因此基础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"

但是,你可能不会期待正确的事情。 缓冲用于减少系统调用的数量,以使系统更有效。 在将文本写入文件之前,将整个文本缓冲到最后是否真的很重要? 你还没有得到文件中的所有输出吗?

当子进程运行时,以下代码将逐行打印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'

您可以使用subprocess.communicate()从stdout获取输出。 就像是:

while(p.poll() == None):
    #read the stdout continuously
    print(p.communicate()[0])
    pass

有关更多信息,请访问: http//docs.python.org/library/subprocess.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM