在Python中实时拦截来自另一个进程的stdout
发布时间:2020-12-20 12:24:57 所属栏目:Python 来源:网络整理
导读:我想运行一个系统进程,拦截输出,并在 Python脚本中逐行实时修改它. 我最好的尝试,等待打印前完成的过程,是: #!/usr/bin/env pythonimport subprocesscmd = "waitsome.py"proc = subprocess.Popen(cmd,shell=True,bufsize=256,stdout=subprocess.PIPE)for li
我想运行一个系统进程,拦截输出,并在
Python脚本中逐行实时修改它.
我最好的尝试,等待打印前完成的过程,是: #!/usr/bin/env python import subprocess cmd = "waitsome.py" proc = subprocess.Popen(cmd,shell=True,bufsize=256,stdout=subprocess.PIPE) for line in proc.stdout: print ">>> " + line.rstrip() 脚本waitsome.py只需每半秒打印一行: #!/usr/bin/env python import time from sys import stdout print "Starting" for i in range(0,20): time.sleep(0.5) print "Hello,iteration",i stdout.flush() 是否有一个简单的解决方案来获得子流程以允许实时迭代输出?我必须使用线程吗? 曾几何时,我用Perl编写脚本,这是小菜一碟: open(CMD,"waitsome.py |"); while (<CMD>) { print ">>> $_"; } close(CMD); 解决方法
循环遍历文件不可避免地会以相当大的块缓冲事物 – 这是所有Python 2. *实现的已知问题.它适用于Python 3.1,最终循环略有不同:
for line in proc.stdout: print(">>> " + str(line.rstrip())) 如果升级到Python 3.1是不切实际的(我知道它通常是!),那么转向另一种方式并以老式的方式编写循环 – 以下版本的循环确实可以像Python 2中那样工作.* : while True: line = proc.stdout.readline() if not line: break print ">>> " + line.rstrip() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |