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

2024-10-24 08:51:00
admin
原创
479
摘要:问题描述:我想要执行 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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用