python - 在执行时读取子进程的stderr

标签 python buffer subprocess stderr

我想读取子进程在执行时写入 stderr 的内容。

但是,当我使用我编写的这个脚本时,在子进程退出之前,stderr 似乎没有任何东西可供我阅读。

#!/usr/bin/env python2

import sys
from subprocess import Popen, PIPE, STDOUT

if len(sys.argv) < 2:
    print "Please provide a command"
    sys.exit(1)

sub = Popen(sys.argv[1:], stdout=PIPE, stderr=STDOUT)

for i, line in enumerate(sub.stdout):
    sys.stdout.write("%d: %s" % (i, line))

编辑:

好的,我已经接近了。如果我指定要读取的字节数,它就会克服缓冲。

#!/usr/bin/env python2

import sys 
from subprocess import Popen, PIPE, STDOUT

if len(sys.argv) < 2:
    print "Please provide a command"
    sys.exit(1)

sub = Popen(sys.argv[1:], stdout=PIPE, stderr=STDOUT)

i = 0 
while sub.poll() is None:
    line = sub.stdout.read(64)
    line.strip("\b")
    sys.stdout.write("%d: %s\n" % (i, line))
    i += 1

输出片段:

58:  86 q=21.0 size= 4541841kB time=00:00:22.08 bitrate=1685014.2kbi
frame=  567 fps= 86 q=22.0 size= 4543667kB time=00:00:2
frame=  621 fps= 87 q=20.0 sizs/s    
frame= 4545352kB time=00:00:26.11 bitrate=1425939.2kbits/s    
62: =  686 fps= 90 q=12.0 size= 4546970kB time=00:00:28.89 bitrate=1
frame=  758 fps= 93 q=25.0 size= 4548534kB t
frame=  794 fps= 92 bitrate=1168185.5kbits/s    
65:  q=27.0 size= 4550901kB time=00:00:33.40 bitrate=1115897.0kbits/
frame=  827 fps= 91 q=27.0 size= 4552324kB time=00:00:34.7
frame=  857 fps= 89 q=26.0 size=  
frame=  254kB time=00:00:36.12 bitrate=1032874.9kbits/s    
69: 892 fps= 88 q=25.0 size= 4556598kB time=00:00:37.36 bitrate=9988
frame=  948 fps= 89 q=19.0 size= 4558565kB time=
frame= 1006 fps= 90 q=19937320.4kbits/s    
72: .0 size= 4560139kB time=00:00:42.16 bitrate=885880.0kbits/s    
73: frame= 1060 fps= 91 q=19.0 size= 4561958kB time=00:00:44.49 bitr
frame= 1122 fps= 93 q=18.0 size= 4563460
frame= 1173 fps=0:47.08 bitrate=793898.4kbits/s

现在看来我的问题是 ffmpeg 正在使用退格字符或类似于混淆标准输出。不确定这里发生了什么。

最佳答案

我建议使用 sh模块。这是一个非常好的软件,它用 python 包装子进程并为您提供 pythonic,您会喜欢的漂亮界面。看docs .

如果你真的不需要 sh 模块,使用 communicate Popen

方法

关于python - 在执行时读取子进程的stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15327790/

相关文章:

python - 无法播放 IBM Watson 的 TTS(文本转语音)生成的 WAV 文件

Java 和 Python - 从子进程启动时 System.console() 返回 null

python - subprocess.communicate() 仅在从脚本运行时神秘地挂起

python - 从 ePassport 读取 EF.COM 在 READ BINARY 处失败,显示 rAPDU 6988(安全消息数据对象不正确)

python - 在 Python 中为大量图像生成唯一哈希键的好策略是什么?

java - 数组和读写文本文件问题 - Java

google-cloud-functions - 将 Base64 图像字符串传递给调用 Cloud Vision API 的 Firebase 可调用云函数

python - 使用 Python Dominate 库将 &lt;style&gt; 元素添加到 HTML

android - 带有设备自定义模型的 Django 推送通知

audio - HTML5 Web音频卡住了(缓冲问题?)