使用Python实时解析包含回车的命令行输出进度
我可以把回车符转换成换行符。不过,问题在于我想让这个过程几乎是“实时”的。如果进度条的值只有0和100,那看起来就太傻了 :-)
这段代码一次性返回所有输出:
import subprocess
p = subprocess.Popen(['mplayer', '/home/user/sample.mkv'], stdout=subprocess.PIPE).communicate()[0]
for line in p.splitlines():
if line.strip():
print line
4 个回答
0
好的,谢谢!我会关注一下pexpect这个库。
不过我发现还有一种跨平台的方法可以做到这一点:就是用PyQt4和QProcess。虽然这并不一定适用于所有程序,但对于Qt4的前端应用来说,这确实是个不错的选择 :)
1
根据我的经验,使用缓冲区会让你遇到很多麻烦。原因是标准的C库会检测到标准输出(stdout)没有连接到终端,这样就会使用更多的缓冲区。你对此没有办法,只能修改mplayer
的源代码。
不过,如果你使用python-pexpect,它会用伪终端来启动你的子进程,这样C库就会认为它连接到了终端,从而不会重置缓冲区。
另外,做这种事情时很容易导致子进程出现死锁,这也是python-pexpect能够解决的另一个问题。