我正在使用Python,它是子进程库,用于检查使用strace进行的调用的输出,这是关于以下问题的事情:
subprocess.check_output(["strace", str(processname)])
但是,这只会在被调用的子进程完成后后给我输出,这对于我的用例来说是非常有限的。
我需要该过程的某种“流”或实时输出,因此我需要在该过程仍在运行而不是仅在完成后读取它。
是否有使用子流程库实现此目的的便捷方法? 我正在考虑每x秒进行一次民意测验,但是在文档中没有发现有关如何实现此目的的任何提示。
非常感谢。
答案 0 :(得分:2)
从 Python 3.2 开始(当上下文管理器支持添加到 Popen
时),我发现这是从子进程连续流输出的最直接的方法:
import subprocess
def run(args):
with subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as process:
for line in process.stdout:
print(line.decode('utf8'))
答案 1 :(得分:1)
Popen.poll()
检查子进程是否已终止。设置并返回returncode属性。
因此,您可以:
process = subprocess.Popen('your_command_here',stdout=subprocess.PIPE)
while True:
output = process.stdout.readline()
if process.poll() is not None and output == '':
break
if output:
print (output.strip())
retval = process.poll()
这将循环播放,读取标准输出,并实时显示输出。
答案 2 :(得分:1)
在引用selected answer用于测试运行程序的流输出时存在一些问题。以下对我来说更好:
import subprocess
from time import sleep
def stream_process(process):
go = process.poll() is None
for line in process.stdout:
print(line)
return go
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while stream_process(process):
sleep(0.1)