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

2024-10-24 08:51:00
admin
原创
101
摘要:问题描述:我想要执行 Test_Pipe.py 的输出,我尝试在 Linux 上遵循代码,但没有成功。测试管道.pyimport time while True : print "Someting ..." time.sleep(.1) 调用者.pyimpo...

问题描述:

我想要执行 Test_Pipe.py 的输出,我尝试在 Linux 上遵循代码,但没有成功。

测试管道.py

import time
while True :
    print "Someting ..."
    time.sleep(.1)

调用者.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)

线路proc.stdout.readline()被阻塞,因此没有打印出数据。


解决方案 1:

您显然可以使用 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()

解决方案 2:

Nadia 的代码片段确实有效,但强烈不建议使用 1 字节缓冲区调用 read。更好的方法是使用 fcntl 将 stdout 文件描述符设置为非阻塞

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 确实按规定工作。

解决方案 3:

Test_Pipe.py默认情况下缓冲其标准输出,因此procCaller.py子进程的缓冲区已满之前看不到任何输出(如果缓冲区大小为 8KB,则需要大约一分钟才能填满Test_Pipe.py的标准输出缓冲区)。

要使输出不缓冲(文本流为行缓冲),您可以将-u标志传递给子 Python 脚本。它允许“实时”逐行读取子进程的输出:

import sys
from subprocess import Popen, PIPE

proc = Popen([sys.executable, "-u", "Test_Pipe.py"], stdout=PIPE, bufsize=1)
for line in iter(proc.stdout.readline, b''):
    print line,
proc.communicate()

请参阅 Python 中的链接:从 subprocess.communicate() 读取流输入,了解如何解决非 Python 子进程的块缓冲问题。

解决方案 4:

为了避免在执行诸如“实时将子进程的输出传输到主进程”之类的任务时缓冲总是会出现的很多问题,当需要执行此类任务时,我始终建议在所有非 Windows 平台上使用pexpect ,在 Windows 上使用wexpect,而不是subprocess

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   609  
  在现代项目管理中,资源的有效利用是确保项目成功的关键因素之一。随着技术的不断进步,越来越多的工具和软件被开发出来,以帮助项目经理和团队更高效地管理资源。本文将介绍10款工具,这些工具可以帮助项目团队提升资源利用效率,从而实现项目目标。禅道项目管理软件禅道项目管理软件是一款开源的项目管理工具,广泛应用于软件开发和其他行业...
项目管理系统   3  
  在项目管理领域,软件工具的不断升级和创新是推动效率和协作的关键。2024年,众多项目管理软件将迎来一系列令人期待的升级功能,这些新特性不仅将提升团队的工作效率,还将增强用户体验和数据分析能力。本文将详细介绍10款项目管理软件的最新升级功能,帮助项目经理和团队成员更好地规划和执行项目。禅道项目管理软件禅道项目管理软件一直...
开源项目管理工具   2  
  信创国产系统的10个关键厂商及其技术生态随着全球信息技术格局的不断演变,信创(信息技术应用创新)产业作为国产化替代的重要阶段,正逐步成为推动我国信息技术自主可控、安全可靠的核心力量。信创产业不仅关乎国家信息安全,也是数字经济高质量发展的关键支撑。本文将深入探讨信创国产系统中的10个关键厂商及其技术生态,分析它们在信创浪...
项目管理流程   0  
  在探讨项目管理的广阔领域中,成功并非偶然,而是精心策划、高效执行与持续优化的结果。项目管理的成功之道,可以从明确的目标设定与规划、高效的团队协作与沟通、以及灵活的风险管理与适应变化这三个核心方面进行深入解析。每个方面都是项目成功的基石,它们相互交织,共同支撑起项目的顺利推进与最终成就。明确的目标设定与规划项目管理的首要...
建筑工程项目管理规范   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用