为什么子进程的管道输出与Python不可靠?

时间:2012-04-14 01:58:03

标签: python performance subprocess pipe piping

(Windows)中

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

如果我从Python脚本中调用它,它会持续几秒钟直到它开始,然后它在慢速输出和快速输出之间交替。虽然我有时会读取char中的char,但是还有一个大块的RUSHES。所以我不明白为什么在其他时候我可以逐一看到角色越来越多。 (顺便说一句,它在我的测试中产生了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)

1 个答案:

答案 0 :(得分: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

由于你没有阅读stdout,我认为你不需要管道。

如果您想尝试按原始示例中的char读取char,请尝试每次添加一次刷新:

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

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