Python 如何从subprocess.Popen()获取输出。proc.stdout.readline()块,不打印任何数据

Python 如何从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

我想从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)

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,并且在代码中对我来说工作得很好。