我想在Python中产生一个子进程,该子进程的标准流用于其他目的,而我无法使用它们,并且我想拥有一个专用于我的目的的独立于标准流的管道。

在Python版本2中,以下工作:

foobar.py

#!/usr/bin/python

from os import pipe, environ, read
import subprocess

output, input = pipe()
new_environ = environ.copy()
new_environ["PIPE_INPUT"] = str(input)
subprocess.Popen(['./a.out'], env=new_environ)
print(read(output, 6))


a.out是从foobar.c编译的:

#include <unistd.h>
#include <stdlib.h>

void main() {
    write(atoi(getenv("PIPE_INPUT")), "foobar", 6);
}


这可行,./foobar.py打印foobar

但是,随着shebang线

#!/usr/bin/python3


这是行不通的。当然,这是因为根据文档,在Python 3中描述符是不可继承的。

好吧,那我该如何在Python 3中做到这一点,并确保相同的代码适用于Python2。我不能为不同的Python使用不同的代码,而必须是Python 2和3的可移植代码。

最佳答案

要使input描述符在必要时可继承,请使用

import os

try:
    os.set_inheritable(input, True)
except AttributeError:
    # This is Python 3.3 or older -> Nothing to do
    pass


然后必须将Popen调用修改为

subprocess.Popen(['./a.out'], env=new_environ, close_fds=False)


适用于Python 2和Python 3。

10-07 19:09
查看更多