如何将json对象或字符串传递给进程

时间:2014-06-06 17:43:40

标签: python json

我有一个程序根据收到的数据执行其他python脚本。 它接收的数据采用json格式,对执行的脚本有帮助。

这就是为什么我希望这些脚本以某种方式接收json。我想过使用subprocess模块使用Popen来做这件事,但我不认为它会工作,因为我必须发送一个转义字符串或一个json对象(在json.loads()方法之后) )。 我也可以将json写入文件并阅读它,但这似乎是不好的选择。

那么我如何优雅地实现这一目标呢?

1 个答案:

答案 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.