为什么管道子进程的输出,所以不可靠的使用Python?(Why is piping output o

2019-09-16 12:58发布

(视窗)

我写的调用程序SOX(子模块),如果你指定它这样做,其输出STDERR上的进步,一些Python代码。 我想从输出百分比状态。 如果我把它不能从Python脚本,它会立即启动,并具有光滑的进展,直到100%。

如果我把它从Python脚本,它持续了几秒钟,直到它开始,然后缓慢的输出和快速的输出之间交替。 虽然我读成炭炭有时闯出了一大块。 所以,我不明白,为什么在其他时间我可以看字符由一个越来越之一。 (它产生的数据15KiB在我的测试,顺便说一句。)

我测试用了mkvmerge和mkvextract相同。 他们输出的百分比了。 阅读STDOUT有光滑。

这是如此不可靠! 我怎样才能使SOX的标准错误流更流畅的阅读,也许防止在开始延迟?


我如何打电话阅读:

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)

Answer 1:

按照此密切相关的主题: 无缓冲在使用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.exe -u <script>或设置环境变量PYTHONUNBUFFERED=1



文章来源: Why is piping output of subprocess so unreliable with Python?