从python中的子进程接收返回数据

时间:2015-12-11 08:08:10

标签: python subprocess

我使用subprocess从脚本中生成进程。我的subprocess接受JSON输入并执行一些操作,并应将一些实时数据返回给主进程。我怎样才能从p = subprocess.Popen(['python','handler.py'], stdin=subprocess.PIPE,stdout=subprocess.PIPE) p.communicate(JSONEncoder().encode(data)) while True: out = process.stdout.read(1) if out == '' and process.poll() != None: break if out != '': sys.stdout.write(out) sys.stdout.flush() 执行此操作? 我正在尝试这样的事情。但这是一个错误。

以下是主要流程" main.py"

subprocess

以下是我的if __name__ == '__main__' : command = json.load(sys.stdin) os.environ["PYTHONPATH"] = "../../" if command["cmd"] == "archive" : print "command recieved:",command["cmd"] file_ids, count = archive(command["files"]) sys.stdout.write(JSONEncoder().encode(file_ids)) " 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

但它会引发错误。

EvercamUser.created_months_ago(i).count

我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

communicate读取子进程的所有输出并将其关闭。如果您希望在写完后能够阅读该过程,则必须使用communicate之外的其他内容,例如p.stdin.write。或者,只使用communicate的输出;它应该有你想要的https://docs.python.org/3/library/subprocess.html#popen-objects

答案 1 :(得分:1)

Popen.communicate()在进程停止之前不会返回,并返回所有输出。你不能在它之后读取子进程'stdout。查看the .communicate() docs的顶部:

  

与流程交互:将数据发送到stdin。从stdout和 读取数据   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版本的代码或者您有缓冲问题,请参阅Python: read streaming input from subprocess.communicate()

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

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

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

如果您的实际子进程是Python脚本,请考虑将其作为模块导入并运行相应的函数,请参阅Call python script with input with in a python script using subprocess