Python子流程的实时输出/流
我正在使用Python及其子进程库来检查使用strace调用的输出,具体如下:Python子流程的实时输出/流,python,stream,console,subprocess,Python,Stream,Console,Subprocess,我正在使用Python及其子进程库来检查使用strace调用的输出,具体如下: subprocess.check_output(["strace", str(processname)]) 然而,这只在被调用的子流程完成后提供输出,这对我的用例来说是非常有限的 我需要流程的一种流或实时输出,因此我需要在流程仍在运行时读取输出,而不是仅在流程完成后读取 使用子流程库是否有一种方便的方法来实现这一点? 我正在考虑每x秒进行一次轮询,但在文档中没有找到关于如何实现这一点的任何提示 非常感谢。根据:
subprocess.check_output(["strace", str(processname)])
然而,这只在被调用的子流程完成后提供输出,这对我的用例来说是非常有限的
我需要流程的一种流或实时输出,因此我需要在流程仍在运行时读取输出,而不是仅在流程完成后读取
使用子流程库是否有一种方便的方法来实现这一点?
我正在考虑每x秒进行一次轮询,但在文档中没有找到关于如何实现这一点的任何提示
非常感谢。根据:
波本民意测验
检查子进程是否已终止。设置并返回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()
这将循环,读取标准输出,并实时显示输出
这在当前版本的python中不起作用。至少对于Python3.8.5及更新版本,您应该根据以下内容将output==替换为output==b:
波本民意测验
检查子进程是否已终止。设置并返回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()
这将循环,读取标准输出,并实时显示输出
这在当前版本的python中不起作用。至少对于Python3.8.5和更新版本,您应该将output==替换为output==b在引用测试运行程序的流式输出时遇到一些问题。以下几点对我更有效:
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)
引用测试运行程序的流式输出时遇到一些问题。以下几点对我更有效:
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)
在Python3.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'))
在Python3.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'))
假设我不想简单地打印:我有一个独立的线程,它依赖于实时输出的数据。我将如何尽可能优雅地访问这些数据?此外,感谢您的回答:-使用上述过程从进程中提取的数据将在并行线程中运行的函数中进行处理。因此,您将不打印输出变量,而是将其输入到函数中。我建议使用一个队列——它将包含strace生成的输出——并让您的并行线程在数据可用时立即使用该队列中的数据。退房。还有一个问题:retval=process.poll的作用是什么?我猜自从你回答b/c后,子流程发生了变化,我不得不改变。。。和输出==到。。。输出==b,因为process.stdout.readline返回字节字符串。假设我不想简单地打印:我有一个独立的线程,它依赖于实时输出的数据。我将如何尽可能优雅地访问这些数据?此外,感谢您的回答:-使用上述过程从进程中提取的数据将在并行线程中运行的函数中进行处理。因此,您将不打印输出变量,而是将其输入到函数中。我建议使用一个队列——它将包含strace生成的输出——并让您的并行线程在数据可用时立即使用该队列中的数据。退房。还有一个问题:retval=process.poll的作用是什么?我猜自从你回答b/c后,子流程发生了变化,我不得不改变。。。和输出==到。。。输出==b,因为process.stdout.readline返回字节字符串。否则循环永远不会终止。我想说这对我们的用例非常有效,谢谢分享:我想说这对我们的用例非常有效,谢谢分享:在py3.8.5下工作。比以前的解决方案更优雅-我想知道这里是否有细微差别?相对于我以前使用的基于轮询的方法,它的一个缺点是不能在所有情况下超时。该方法必须无限期地阻塞一行或一个EOF。。。但是在py3.8.5下仍然非常优雅。比以前的解决方案更优雅-我想知道这里是否有细微差别?相对于我以前使用的基于轮询的方法,它的一个缺点是不能在所有情况下超时。该方法必须无限期地阻塞一行或一个EOF。。。但还是很优雅