python 重定向子进程的标准流
python redirect standard stream of subprocess
我正在尝试使用 python 作为后端来创建在线编码平台。我正在使用 subprocess.Popen
到 运行 用户代码。现在我想和它互动。我知道的一种方法是使用 pipe
和 dup2
但问题是它在我的整个后端应用程序的上下文中更改了标准 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())
我正在尝试使用 python 作为后端来创建在线编码平台。我正在使用 subprocess.Popen
到 运行 用户代码。现在我想和它互动。我知道的一种方法是使用 pipe
和 dup2
但问题是它在我的整个后端应用程序的上下文中更改了标准 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())