我想在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。