我使用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
我在这里做错了什么?
答案 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。