python 重定向子进程的标准流

python redirect standard stream of subprocess

我正在尝试使用 python 作为后端来创建在线编码平台。我正在使用 subprocess.Popen 到 运行 用户代码。现在我想和它互动。我知道的一种方法是使用 pipedup2 但问题是它在我的整个后端应用程序的上下文中更改了标准 i/o。 我希望标准流仅针对子进程进行更改。

我可以传递给 subprocess.Popen 的任何参数,以便主 python 应用程序可以访问其子进程的标准流吗?

示例:

import subprocess
args=['py',path+'t.py']
p = subprocess.Popen(args)

t.py是Hello World程序。子进程将在终端中打印 Hello World,但我希望它重定向到其他文件描述符,以便我可以访问变量并通过网络发送它。输入也是如此。

更新:

我做到了

r,w=os.pipe()

p = subprocess.Popen(args,stdout=w)

为此我得到错误

 Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp1252'>
OSError: [Errno 22] Invalid argument

subprocess Popen 为此类使用 PIPE 的事物提供了额外的命名参数,正如您提到的

from subprocess import Popen, PIPE, STDOUT

args=['py',path+'t.py']

# errors included
p = Popen(args, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)

#BufferedWriter for input
input_stream = p.stdin

#BufferedReader for output
output_stream = p.stdout


print(output_stream.read())