【发布时间】:2020-02-25 21:25:07
【问题描述】:
注意:我知道我可以使用 stdout=subprocess.PIPE 捕获 subprocess 输出。
在我的情况下,subprocess 将由导入的模块启动,例如youtube-dl 将为ffmpeg 启动一个subprocess,我想捕捉ffmpeg 的输出。
我做了一个虚拟的工作场景来说明我的观点。
我有 2 个文件:m1.py“我的模块”和 m2.py“导入的库”
m2.py
import subprocess
def run():
print('m2 module message will be caught by echo function too')
cmd = ['ping', 'google.com']
subprocess.Popen(cmd)
m1.py
import sys
import m2
# this is a redirection function to echo stdout to a file
def echo(text):
with open('out.txt', 'a') as f:
f.write(text)
sys.stdout.write = original
sys.stdout.write(text)
sys.stdout.write = echo
original = sys.stdout.write
sys.stdout.write = echo
print('m1 module message will be caught by echo function')
m2.run()
终端输出:
m1 module message will be caught by echo function
m2 module message will be caught by echo function too
Pinging google.com [172.217.18.46] with 32 bytes of data:
Reply from 172.217.18.46: bytes=32 time=86ms TTL=53
Reply from 172.217.18.46: bytes=32 time=78ms TTL=53
out.txt
m1 module message will be caught by echo function
m2 module message will be caught by echo function too
从上面可以清楚地看出,out.txt 文件从两个模块都收到了 2 打印语句,但无法获得其他输出
这里的问题,我怎样才能得到 m2.py 启动的“ping”命令的输出,“我肯定不能更改 m2.py 的代码,因为它是第 3 方库并且每周更新一次”
【问题讨论】:
标签: python subprocess stdout