我有一个要通过子进程启动的程序.除了stdout和stderr之外,它还可以输出到fd.有没有办法从任意fd捕获数据?如果我的进程正在将输出发送到fd 9,我想执行以下操作:import subprocess, StringIOredirector = StringIO....

我有一个要通过子进程启动的程序.除了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.
解决方法:
如果程序在开始运行后打开文件描述符9(或其他文件),则无法执行所需的操作.
如果程序没有打开文件描述符9本身,而是从父进程中获取文件描述符,那么您可以使用subprocess.Popen的preexec_fn参数来执行所需的操作,但它并不像在StringIO实例中设置内容那样简单.您必须手动创建一个管道,并且必须安排及时读取该管道,否则将导致死锁.期望编写两三百行代码来正确实现这一目标.我不会在此处放置任何示例代码,因为我不想使其看起来比实际容易.
除subprocess.Popen之外,您还需要os.pipe、os.dup2和os.read,并且需要了解底层系统原语:
pipe(2)、dup2(2)、read(2)、fork(2)和execve(2).
现在可能是投资Advanced Programming in the Unix Environment副本的好时机.
本文标题为:python-如何捕获除stdout / stderr以外的子进程的输出?


基础教程推荐
- Python Multiprocessing.Process如何重用一个进程? 2023-11-12
- windows python2下停止,清空,启动tomcat 2023-09-03
- Python matplotlib绘制灰度和彩色直方图 2023-08-09
- windows 安装python 2023-09-04
- python time时间库详解 2022-08-30
- CentOs系统自带python和yum卸载后的解决办法 2023-09-03
- python读取Windows注册表的示例代码 2022-09-03
- pandas学习之df.set_index的具体使用 2022-08-30
- 利用Python将txt文件录入Excel表格的全过程 2023-08-04
- python数据结构输入输出及控制和异常 2023-08-08