在python中从子流程接收返回数据

在python中从子流程接收返回数据,python,subprocess,Python,Subprocess,我正在使用子进程从脚本生成一个进程。我的子进程接受一个JSON输入并执行一些操作,应该向主进程返回一些实时数据。如何从子流程执行此操作? 我正在尝试这样的事情。但这是一个错误 以下是五月的主要流程“main.py” 下面是我的子流程“handler.py” 但它抛出了一个错误 Traceback (most recent call last): File "./core/main.py", line 46, in <module> out = p.stdout.read(1)

我正在使用
子进程
从脚本生成一个进程。我的
子进程
接受一个JSON输入并执行一些操作,应该向主进程返回一些实时数据。如何从
子流程
执行此操作? 我正在尝试这样的事情。但这是一个错误

以下是五月的主要流程“main.py”

下面是我的
子流程
“handler.py”

但它抛出了一个错误

Traceback (most recent call last):
  File "./core/main.py", line 46, in <module>
  out = p.stdout.read(1)
ValueError: I/O operation on closed file
回溯(最近一次呼叫最后一次):
文件“/core/main.py”,第46行,在
out=p.stdout.read(1)
ValueError:对关闭的文件执行I/O操作

我做错什么了吗

通信
读取子流程的所有输出并将其关闭。如果您希望能够在写入后读取进程,则必须使用
通信
以外的其他工具,例如
p.stdin.write
。或者,只需使用
communicate
的输出即可;它应该有你想要的。

communicate
读取子流程的所有输出并将其关闭。如果您希望能够在写入后读取进程,则必须使用
通信
以外的其他工具,例如
p.stdin.write
。或者,只需使用
communicate
的输出即可;它应该具有您想要的功能。

Popen.communicate()
在进程停止并返回所有输出之前不会返回。无法读取子进程的标准输出。请看以下内容的顶部:

与进程交互:向stdin发送数据从标准输出读取数据,并 stderr,直到到达文件末尾等待进程终止。重点是我的

如果要发送数据,然后在子进程仍在运行时以文本形式逐行读取输出,请执行以下操作:

#!/usr/bin/env python3
import json
from subprocess import Popen, PIPE

with Popen(command, stdin=PIPE, stdout=PIPE, universal_newline=True) as process:
    with process.stdin as pipe:
        pipe.write(json.dumps(data))
    for line in process.stdout:
        print(line, end='')
        process(line)
如果需要用于较旧python版本的代码或存在缓冲问题,请参阅

如果您只想将数据传递给子进程并将输出打印到终端:

#!/usr/bin/env python3.5
import json
import subprocess

subprocess.run(command, input=json.dumps(data).encode())

如果您的实际子进程是Python脚本,那么考虑将它作为一个模块导入并运行相应的函数,参见.< /P> < P> <代码> Popen。无法读取子进程的标准输出。请看以下内容的顶部:

与进程交互:向stdin发送数据从标准输出读取数据,并 stderr,直到到达文件末尾等待进程终止。重点是我的

如果要发送数据,然后在子进程仍在运行时以文本形式逐行读取输出,请执行以下操作:

#!/usr/bin/env python3
import json
from subprocess import Popen, PIPE

with Popen(command, stdin=PIPE, stdout=PIPE, universal_newline=True) as process:
    with process.stdin as pipe:
        pipe.write(json.dumps(data))
    for line in process.stdout:
        print(line, end='')
        process(line)
如果需要用于较旧python版本的代码或存在缓冲问题,请参阅

如果您只想将数据传递给子进程并将输出打印到终端:

#!/usr/bin/env python3.5
import json
import subprocess

subprocess.run(command, input=json.dumps(data).encode())

如果您的实际子进程是Python脚本,那么考虑将它作为一个模块导入并运行相应的函数,参见.p/> <代码>进程<代码>从何而来?您可以使用

子流程popen
创建
p
流程从何而来?您可以使用
子流程popen
创建
p