我想从执行Test_Pipe.py输出,我尝试在Linux上使用代码,但它没有用.
Test_Pipe.py
import time
while True :
print "Someting ..."
time.sleep(.1)
Run Code Online (Sandbox Code Playgroud)
Caller.py
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)
Run Code Online (Sandbox Code Playgroud)
该行proc.stdout.readline()被阻止,因此没有数据打印出来.
我有一些Python代码执行外部应用程序,当应用程序有少量输出时工作正常,但有很多时挂起.我的代码看起来像:
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
errcode = p.wait()
retval = p.stdout.read()
errmess = p.stderr.read()
if errcode:
log.error('cmd failed <%s>: %s' % (errcode,errmess))
Run Code Online (Sandbox Code Playgroud)
文档中的评论似乎表明了潜在的问题.等待,有:
警告:如果子进程生成足够的输出
stdout或stderr管道,以阻止等待OS管道缓冲区接受更多数据,这将导致死锁.使用communicate()以避免这种情况.
虽然在沟通中,我看到:
注意读取的数据缓冲在内存中,因此如果数据大小很大或不受限制,请不要使用此方法.
因此我不清楚如果我有大量数据,我应该使用其中任何一种.它们没有说明在这种情况下我应该使用什么方法.
我确实需要来自exec的返回值并进行解析并使用stdout和stderr.
那么Python中用于执行具有大输出的外部应用程序的等效方法是什么?