我有一个程序根据收到的数据执行其他python脚本。 它接收的数据采用json格式,对执行的脚本有帮助。
这就是为什么我希望这些脚本以某种方式接收json。我想过使用subprocess
模块使用Popen
来做这件事,但我不认为它会工作,因为我必须发送一个转义字符串或一个json对象(在json.loads()方法之后) )。
我也可以将json写入文件并阅读它,但这似乎是不好的选择。
那么我如何优雅地实现这一目标呢?
答案 0 :(得分:3)
如果一次只有一个子流程,并且父级将等待孩子完成,则可以使用Popen.communicate()
。例如:
# Create child with a pipe to STDIN.
child = subprocess.Popen(..., stdin=subprocess.PIPE)
# Send JSON to child's STDIN.
# - WARNING: This will block the parent from doing anything else until the
# child process finishes
child.communicate(json_str)
然后,在子进程(如果是python)中,您可以使用:
来阅读它# Read JSON from STDIN.
json_str = sys.stdin.read()
或者,如果您想要更复杂的用法,其中父级可以多次写入多个子进程,那么在父进程中:
# Create child with a pipe to STDIN.
child = subprocess.Popen(..., stdin=subprocess.PIPE)
# Serialize and send JSON as a single line (the default is no indentation).
json.dump(data, child.stdin)
child.stdin.write('\n')
# If you will not write any more to the child.
child.stdin.close()
然后,在孩子中,你会在需要时阅读每一行:
# Read a line, process it, and do it again.
for json_line in sys.stdin:
data = json.loads(json_line)
# Handle received data.