python - 如何捕获 stdout/stderr 以外的子进程的输出?

标签 python subprocess

我有一个程序,我想通过子进程启动。它可以输出到 fd 而不是 stdout 和 stderr。有没有办法从任意 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 本身,而是从父进程获取它,那么你可以用 preexec_fn 参数做你想做的 subprocess.Popen,但这并不像为 StringIO 实例设置一些东西那么简单。您必须手动创建一个管道,并且必须及时安排从中读取数据,否则您导致死锁。预计要编写两三百行代码才能做到 100% 正确。我不打算在此处放置任何示例代码,因为我不想让它看起来比实际更简单。

除了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 以外的子进程的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12589419/

相关文章:

python - 如何在 PyTorch 模型中查找中间层的输入层名称?

python - 为什么 subprocess.Popen 类没有命名为 Subprocess?

python错误代码处理

python - subprocess.check_call 与标准输入

python - 如何在 SliTaz 或 Haiku 上使用 AES 或 DES 算法

python - 无法使用 pyserial python 脚本从串行端口写入和读取

python - 如何使用 plone.api create 和 NamedBlobFile 在 Plone 中处理上传文件

python - 实时读取python STDOUT

python - 如何从aiohttp中的子进程读取?

python - 测试 Google App Engine 站点是否存在损坏的链接和其他请求错误