如何捕获 stdout/stderr 之外的子进程的输出?

问题描述 投票:0回答:2

我有一个程序想通过子进程启动。 它可以输出到stdout和stderr以外的fd。 有没有办法从任意 fd 中捕获数据? 如果我的进程将输出发送到 fd 9,我想做类似以下的事情:

import subprocess, StringIO
redirector = StringIO.StringIO()
errno = subprocess.call(cmd, fd9=redirector)
#process the error code and data in redirector

我确实不想想通过stderr或stdout将被调用进程的输出重定向到fd 9。

python subprocess
2个回答
3
投票

如果程序在开始运行后打开文件描述符9(或其他),则无法执行您想要的操作。

如果程序打开文件描述符9本身,而是从父进程获取它,那么你可以使用

preexec_fn
的参数
subprocess.Popen
做你想做的事情,但这并不像设置一些东西那么简单一个
StringIO
实例。 您必须手动创建一个管道,并且必须安排及时从中读取数据,否则“将”导致死锁。 预计要编写两三百行代码才能 100% 正确。 我不会在这里放置任何示例代码,因为我不想让它看起来比实际更容易。 除了

subprocess.Popen

之外,您还需要
os.pipe
os.dup2
os.read
,并且您需要了解底层系统原语: 
 
pipe(2)
dup2(2)
read(2)
fork(2)
execve(2)
现在可能是购买一本

Unix 环境中的高级编程的好时机。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.