我目前有此代码,可根据上下文通过管道传递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中实现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
的结果。