相关疑难解决方法(0)

如何从subprocess.Popen()获取输出.proc.stdout.readline()块,没有数据打印出来

我想从执行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 linux subprocess popen

38
推荐指数
4
解决办法
9万
查看次数

使用subprocess.Popen进行大输出的进程

我有一些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)

文档中的评论似乎表明了潜在的问题.等待,有:

警告:如果子进程生成足够的输出stdoutstderr管道,以阻止等待OS管道缓冲区接受更多数据,这将导致死锁.使用communicate()以避免这种情况.

虽然在沟通中,我看到:

注意读取的数据缓冲在内存中,因此如果数据大小很大或不受限制,请不要使用此方法.

因此我不清楚如果我有大量数据,我应该使用其中任何一种.它们没有说明在这种情况下我应该使用什么方法.

我确实需要来自exec的返回值并进行解析并使用stdoutstderr.

那么Python中用于执行具有大输出的外部应用程序的等效方法是什么?

python subprocess

31
推荐指数
5
解决办法
2万
查看次数

标签 统计

python ×2

subprocess ×2

linux ×1

popen ×1