3

(视窗)

我编写了一些调用程序 SoX(子进程模块)的 Python 代码,如果您指定它,它会在 STDERR 上输出进度。我想从输出中获取百分比状态。如果我不是从 Python 脚本中调用它,它会立即启动并平稳进展到 100%。

如果我从 Python 脚本调用它,它会持续几秒钟直到它开始,然后它会在慢速输出和快速输出之间交替。尽管我有时会逐个字符地读取字符,但会冲出一大块。所以我不明白为什么在其他时候我可以看到角色一个接一个地变多。(顺便说一下,它在我的测试中生成了 15KiB 的数据。)

我已经用 mkvmerge 和 mkvextract 进行了同样的测试。他们也输出百分比。在那里阅读 STDOUT 很顺利。

这太不靠谱了!如何使 sox 的 stderr 流的读取更流畅,并可能防止一开始的延迟?


我如何打电话和阅读:

process = subprocess.Popen('sox_call_dummy.bat', stderr = subprocess.PIPE, stdout = subprocess.PIPE)
while True:
    char = process.stderr.read(1).encode('string-escape')
    sys.stdout.write(char)
4

1 回答 1

1

根据这个密切相关的线程:Unbuffered read from process using subprocess in Python

process = subprocess.Popen('sox_call_dummy.bat', 
                stderr = subprocess.PIPE, bufsize=0)
while True:
    line = process.stderr.readline()
    if not line: 
        break
    print line

由于您没有阅读标准输出,因此我认为您不需要管道。

如果您想尝试像原始示例中那样逐个字符地读取字符,请尝试每次添加一个刷新:

sys.stdout.write(char)
sys.stdout.flush()

每次编写时刷新标准输出是手动等效于禁用 python 进程的缓冲: python.exe -u <script>或设置 env 变量PYTHONUNBUFFERED=1

于 2012-04-14T02:20:36.930 回答