(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)
答案 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