如何从 subprocess.Popen() 获取输出。proc.stdout.readline() 阻塞,没有数据打印出来
- 2024-10-24 08:51:00
- admin 原创
- 92
问题描述:
我想要执行 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
默认情况下缓冲其标准输出,因此proc
在Caller.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
。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD