【发布时间】:2021-02-02 02:06:21
【问题描述】:
我有两个脚本 parent.py 和 child.py parent.py 调用 child.py 作为子进程。 Child.py 有一个在字典中收集某些结果的函数,我希望将该字典返回给父进程。我尝试通过将 child.py 中的字典打印到其 STDOUT 上,以便父进程可以读取它,但这对我没有帮助,因为字典的内容正在被父进程作为单独的行中的字符串读取。
此外,正如 cmets 中所建议的那样,我尝试使用 JSON 序列化字典,同时在 stdout 上打印它,并使用 JSON 从父级读取它,效果很好,但我也打印了很多来自孩子的其他信息到它的标准输出,它最终也被父级读取并且正在混淆。
提出的另一个建议是将子级的结果写入目录中的一个文件,并让父级从该文件中读取。这也可以,但我会在 Celery 中运行 100 多个此代码的实例,因此它会导致其他子实例覆盖同一文件。
我的问题是,因为我们有一个连接两个进程的管道,我如何才能将我的字典直接从 child.py 写入管道并从 parent.py 读取它
# parent.py
import subprocess
proc = subprocess.Popen(['python3', 'child.py'],
stdin=subprocess.PIPE,
stdout = subprocess.PIPE
)
proc.comunicate()
result = proc.stdout
#child.py
def child_function():
result = {}
result[1] = "one"
result[2] = "two"
print(result)
#return result
if __name__ == "__main__":
child_function()
【问题讨论】:
-
为了通过管道传输字典,您需要将其序列化,例如作为 JSON。但是,为什么不直接从 parent.py 导入并调用
child_function()? -
您可以使用 JSON 序列化数据:child.py 中的
print(json.dumps(result))和 parent.py 中的result = json.loads(proc.stdout)。 -
@mkrieger1 感谢您的回复。是的,我希望我可以从父级导入 child_function() 但我处于这样一种情况,因为我必须将 child.py 作为子进程调用,因为我以 root 身份运行父级,但 child.py 中存在的某些功能没有以 root 用户身份工作,因此我通过子进程调用 child.py 与单独的非 root 用户。
-
@IonutTicus 谢谢你的建议,我会试试的。
-
@IonutTicus 没有任何方法可以通过 PIPE 直接将 child.py 中的字典传递给父级,而不是“首先将其打印到子级的 STDOUT”,然后让父级从子级的标准输出中读取它.我的意思是,当我们已经通过 PIPE 连接时,为什么要在 STDOUT 上打印它,为什么我们不能直接通过 PIPE 将该值传递给它的父级?寻找它的原因是我还打印了很多其他的东西,从孩子到它的 STDOUT(调试信息),如果我打印它,那些其他的东西会弄乱字典。
标签: python python-3.x subprocess popen popen3