Python subprocess.Popen管道自定义fd

问题描述 投票:3回答:1

我目前有此代码,可根据上下文通过管道传递stdout或stderr:

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上输出的命令。

我已经看到了向stdout或stderr之外的其他fd写入代码,但是没有一个从自定义fd读取的代码。因此,如何从subprocess.Popen中传递自定义fd?

python subprocess
1个回答
0
投票

由于我需要一个答案,所以这对其他人来说是一个迟来的答案:

为了在Python中实现a similar use of additional 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()

[我认为将os.dup2(write_pipe, 26)构造函数与Popen组合在一起之前的pass_fds=[26]将完成为您提供特定fd编号的最后一步,而不只是os.pipe选择的任何内容,但我尚未对其进行测试。

[如果没有别的,如果在调用实际目标命令之前使用write_pipe调用运行subprocess.Popen的shell脚本包装程序,应该可以将fd 26重定向到exec 26>$WHATEVER的结果。

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