gpt4 book ai didi

python - 如何为 subprocess.call 创建自定义输出流

转载 作者:行者123 更新时间:2023-11-30 22:29:56 26 4
gpt4 key购买 nike

我试图通过定义自己的输出流来获取 subprocess.call 的实时输出,但它似乎不起作用。

原因:我想运行一个子进程并获取对 stdout 的调用的输出(实时以便我可以查看脚本并查看当前进度)并将其记录到文件中

子进程.py:

import time

while True:
print("Things")
time.sleep(1)

主进程.py

import subprocess
import io

class CustomIO(io.IOBase):
def write(self, str):
print("CustomIO: %s"%str)
# logging to be implemented here

customio = CustomIO()
subprocess.call(["python3", "print_process.py"], stdout=customio)

但是当我运行此代码时,我收到此错误消息:

Traceback (most recent call last):                                   
File "call_test.py", line 9, in <module>
subprocess.call(["python3", "print_process.py"], stdout=customio)
File "/usr/lib/python3.4/subprocess.py", line 537, in call
with Popen(*popenargs, **kwargs) as p:
File "/usr/lib/python3.4/subprocess.py", line 823, in __init__
errread, errwrite) = self._get_handles(stdin, stdout, stderr)
File "/usr/lib/python3.4/subprocess.py", line 1302, in _get_handles
c2pwrite = stdout.fileno()
io.UnsupportedOperation: fileno

那么,有人知道这是否可能吗?

我继承了错误的基类吗?

我没有重载正确的方法吗?

或者我是否完全偏离了轨道,应该以完全不同的方式来解决这个问题?

最佳答案

如果要处理子进程的输出,则需要传递stdout=subprocess.PIPE。但是,call()run() 都会等到进程完成后才使其可用,因此您无法使用这些函数实时处理它。

您需要使用subprocess.Popen:

import subprocess as sp

def handle_output(output_line):
...

my_process = sp.Popen(["python3", "print_process.py"],
stdout=sp.PIPE,
universal_newlines=True) # changes stdout from bytes to text

for line in my_process.stdout:
handle_output(line)

my_process.wait()

更新:确保刷新子进程中的输出缓冲区:

while True:
print("Things", flush=True)
time.sleep(1)

关于python - 如何为 subprocess.call 创建自定义输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46201419/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com