Python subprocess.Popen管道自定义文件描述符

3
我目前有一段代码,它会按照上下文输出标准输出或标准错误流:
def execteInstruction(cmd, outputNumber):
  do_stdout = DEVNULL
  do_stderr = DEVNULL
  if outputNumber != 2:
    do_stdout = subprocess.PIPE
  else:
    do_stderr = subprocess.PIPE
  return subprocess.Popen(cmd, shell=True, stderr=do_stderr, stdout=do_stdout)

然后我使用 communicate() 读取结果。这很完美地运行,但我需要读取自定义fd,因为我正在使用子进程运行一个输出在文件描述符26上的命令。

我看到过写入其他fd而不是stdout或stderr的代码,但没有读取自定义fd的代码。 那么我该如何从subprocess.Popen中管道传递自定义fd?


我不明白你想做什么:你是想直接访问stdout/stderr的fd吗?还是需要访问子进程创建的新fd?如果是这样,你运行的是什么类型的cmd,并且能否将新fd提供给cmd?你是在特定平台上运行吗?subprocess在Windows/Unix上的行为是不同的... - Thomas Moreau
1个回答

2

因为我需要一个答案,所以对于其他人来说,以下是一个非常迟的答案:

为了在Python中实现使用附加fds的类似方法,我想出了这段代码:

import os, subprocess

read_pipe, write_pipe = os.pipe()
xproc = subprocess.Popen(['Xephyr', '-displayfd', str(write_pipe)],
                         pass_fds=[write_pipe])

display = os.read(read_pipe, 128).strip()

我认为在Popen构造函数之前使用os.dup2(write_pipe, 26),再加上pass_fds=[26],可以完成获取特定fd号码的最后一步,而不仅仅是os.pipe选择的任意fd号码,但我还没有测试过。
如果没有其他办法,也应该可以将fd 26重定向到write_pipe所代表的内容,如果您使用subprocess.Popen调用一个shell脚本包装器,它在调用实际目标命令之前运行exec 26>$WHATEVER

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接