【问题标题】:Simultaneously Call a Script from Python, passing data to each, and Returning data to the original同时从 Python 调用脚本,将数据传递给每个脚本,并将数据返回到原始
【发布时间】:2026-02-15 04:40:02
【问题描述】:

我正在尝试创建一个 python 脚本,该脚本调用 5 个其他 python 脚本同时运行,同时传入一个数组,然后 5 个脚本中的每一个对该数组执行一个操作并将不同的数组返回给初始脚本。

初始脚本然后意识到这5个已经返回值,然后对这5个数组执行操作。

我认为解决方案类似于 os.system(./script1.py arg1), os.system(./script2.py arg2) 但我不确定如何进行。

【问题讨论】:

  • 如果你想同时运行这五个脚本,你不应该使用os.system。使用subprocess 模块。

标签: python arrays multiple-inheritance data-transfer simultaneous-calls


【解决方案1】:

您可以使用线程池来并行运行所有命令。我还改用了subprocess 模块,它可以获取程序输出:

import multiprocessing.pool
import subprocess as subp

def worker(script):
    proc = subp.Popen(script, shell=True, stdout=subp.PIPE, stderr=subp.PIPE)
    out, err = proc.communicate()
    return script, out, err, proc.returncode

scripts = ['./script1.py arg1', './script2.py arg2']
pool = multiprocessing.pool.ThreadPool(len(scripts))
for script, out, err, returncode in pool.map(worker, scripts):
    do your magic
pool.close()
pool.join()

【讨论】:

  • 这看起来有点像我所追求的,但我不清楚 for 脚本是什么,out, .. do your magic is for。不同脚本的输出又在哪里返回?
  • 池在scripts 中为每个项目创建一个线程。 pool.map 将每个脚本和工作函数发送到线程,然后作为迭代器将工作返回值传递给主程序。因此,for 循环依次获取每个脚本的结果。根据您想要处理数据的方式,您可以兼顾返回的内容和组装方式。例如,worker 可以只返回out,您可以获得outputs = list(pool.map(worker, scripts)) 的输出列表。
  • 哇。多谢。这很好用。有没有办法可以考虑每个脚本的输出与它们打印的内容分开?即在 pool.map 中是否有返回值和输出值?
  • Popen.communicate 文档解释得最好。此示例返回程序的 stdoutstderr(程序通常打印的内容)和 returncode(单个整数),这就是您在 pool.map 的返回中迭代的内容。通过在 for 循环中打印变量来尝试一下,看看发生了什么。