如何将值从子脚本传递给同时运行的父脚本?

Posted

技术标签:

【中文标题】如何将值从子脚本传递给同时运行的父脚本?【英文标题】:How to I pass a value from a child script to a parent script that are both running at the same time? 【发布时间】:2011-08-21 11:54:50 【问题描述】:

提前将值返回给 Python 中的调用进程?

你好,我想问一下有没有办法让一个脚本调用另一个脚本,让这两个脚本同时运行,并让子脚本在子脚本完成之前很久就向父脚本发送一个值正在运行(不提前退出该子脚本)?我正在寻找 Python 中的解决方案,但任何信息或线索都会有所帮助,谢谢。

我认为执行此操作的一种方法是将要发送回父脚本的值打印到标准输出,然后让父脚本重定向它或以某种方式获取它,但必须有一个更好的解决方案,因为如果子脚本打印其他内容怎么办? (然后父脚本必须知道如何使用 Unix 头尾命令之类的东西隔离输出的确切部分,如果您根本不想使用标准输出怎么办?)

我已经搜索过这个问题的答案,但我找不到任何答案。

【问题讨论】:

【参考方案1】:

您可以使用multiprocessing 从父脚本启动子脚本。 mp.Queue 可用于将子脚本的输出传递回父脚本。这是一个简单的例子:

parent.py

import multiprocessing as mp
import child

if __name__ == '__main__':
    queue = mp.Queue()
    proc = mp.Process(target=child.main, args=(queue,))
    proc.daemon = True  
    # This launches the child process, calling child.main()
    proc.start()         
    for i in range(10):
        result = queue.get()  # Get results from child.main
        print(result)

child.py

import time

def main(queue=None):
    for i in range(10):
        # do a computation
        result = i
        if queue:
            # Put a result in the queue for the parent to get
            queue.put(result)   
        time.sleep(.5)

if __name__=='__main__':  
    # We reach here only when child.py is run as a script 
    # (as opposed to child being imported as a module).
    main()  

请注意,通过queue 传递的result 必须是可腌制的。

【讨论】:

感谢您的回答,但现在我想弄清楚 parent.py 如何知道启动 child.py 脚本而不是其他脚本?,因为我没有看到名称在“parent.py”脚本的任何地方都提到了“child.py”。 parent.py 脚本不运行 child.py 脚本。相反,它只运行一个函数child.run。但这并不是真正的限制,因为您可以轻松地将脚本的所有操作放入函数中。一些小的重构应该允许您将child.py 作为独立脚本运行,并且还可以导入和调用child.run。我将编辑我的答案以(希望)澄清我的意思。【参考方案2】:

最好使用专门为此目的设计的multiprocessing module。

【讨论】:

以上是关于如何将值从子脚本传递给同时运行的父脚本?的主要内容,如果未能解决你的问题,请参考以下文章

Terraform:如何将变量传递给 user_data 初始化脚本

Groovy脚本将值传递给sh。脚本

c#在不退出子线程的情况下将值从子线程传递给父线程

为啥我在实现委托以将值从子 swift 类传递给父目标 C 类时出错?

在 Unity 中,如何将值从一个脚本传递到另一个脚本?

将值传递给“注入脚本”而不是依赖全局变量?