Python 如何从subprocess.Popen()获取输出。proc.stdout.readline()块,不打印任何数据
我想从executetest_Pipe.py获得输出,我在Linux上尝试了以下代码,但没有成功 测试管道.pyPython 如何从subprocess.Popen()获取输出。proc.stdout.readline()块,不打印任何数据,python,linux,subprocess,popen,Python,Linux,Subprocess,Popen,我想从executetest_Pipe.py获得输出,我在Linux上尝试了以下代码,但没有成功 测试管道.py import time while True : print "Someting ..." time.sleep(.1) import subprocess as subp import time proc = subp.Popen(["python", "Test_Pipe.py"], stdout=subp.PIPE, stdin=subp.PIPE) wh
import time
while True :
print "Someting ..."
time.sleep(.1)
import subprocess as subp
import time
proc = subp.Popen(["python", "Test_Pipe.py"], stdout=subp.PIPE, stdin=subp.PIPE)
while True :
data = proc.stdout.readline() #block / wait
print data
time.sleep(.1)
Caller.py
import time
while True :
print "Someting ..."
time.sleep(.1)
import subprocess as subp
import time
proc = subp.Popen(["python", "Test_Pipe.py"], stdout=subp.PIPE, stdin=subp.PIPE)
while True :
data = proc.stdout.readline() #block / wait
print data
time.sleep(.1)
行
proc.stdout.readline()
被阻止,因此没有数据输出。显然,您可以使用subprocess.communicate,但我认为您正在寻找实时输入和输出
readline被阻止,因为进程可能正在等待您的输入。您可以按如下方式逐字阅读以克服此问题:
import subprocess
import sys
process = subprocess.Popen(
cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
while True:
out = process.stdout.read(1)
if out == '' and process.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
为了避免任务缓冲(如“将子进程的输出实时发送到主进程”)时经常出现的许多问题,我始终建议在Windows上对所有非Windows平台使用,而不是对子进程使用
,当需要这样的任务时。Nadia的代码片段确实有效,但使用1字节缓冲区调用read是非常不可取的。更好的方法是使用fcntl将标准输出文件描述符设置为非阻塞
fcntl.fcntl(
proc.stdout.fileno(),
fcntl.F_SETFL,
fcntl.fcntl(proc.stdout.fileno(), fcntl.F_GETFL) | os.O_NONBLOCK,
)
然后使用select测试数据是否准备就绪
while proc.poll() == None:
readx = select.select([proc.stdout.fileno()], [], [])[0]
if readx:
chunk = proc.stdout.read()
print chunk
她是正确的,因为您的问题必须不同于您发布的Caller.py和Test_Pipe.py,请按照提供的方式工作
默认情况下,
Test\u Pipe.py
缓冲其标准输出,因此Caller.py
中的proc
在孩子的缓冲区满之前看不到任何输出(如果缓冲区大小为8KB,则填充Test\u Pipe.py
的标准输出缓冲区大约需要一分钟)
要使输出无缓冲(文本流的行缓冲),可以传递给子Python脚本。它允许“实时”逐行读取子流程的输出:
请参阅中有关如何解决非Python子进程的块缓冲问题的链接。Duplicate:,它不会比问题中的代码更快地生成输出,原因是。代码确实会实时生成输出。你对它有问题吗?请点击评论中的链接。数据“准备就绪”意味着什么?它是新行还是至少有一个字节的数据准备就绪(即使这些数据的生产者仍在向其标准输出写入数据)?@me,J.F.Sebastian在下面的回答中提到了这一点。同样,您使用的是1字节缓冲区,它的效率非常低。@DerrickPetzold:错bufsize=1
表示“缓存行”。它使用与bufsize=-1
相同的缓冲区大小。如果您实际运行代码(比较时间性能并测量读取第一个字节之前的时间),您可能会发现您的两个注释都是错误的。我喜欢这种方式,因为您可以直接打印到屏幕上,还可以存储popen的结果以进行处理,然后检查错误代码等。。。thumbs up=)我在运行它时没有使用bufsize,并且在代码中对我来说工作得很好。