【问题标题】:Run bash scripts in parallel from python script从 python 脚本并行运行 bash 脚本
【发布时间】:2023-04-07 22:43:01
【问题描述】:

我在 python 中遇到了一个问题:

我的脚本在某个时候必须运行一些用 bash 编写的测试脚本,我必须并行执行,并等到它们结束。 我已经试过了:

os.system("./script.sh &")

在 for 循环中,但它不起作用。

有什么建议吗?

谢谢!

编辑

我没有正确解释我的情况: 我的 phyton 脚本位于主目录中; 我的 sh 脚本位于其他目录中,例如 /tests/folder1 和 /tests/folder2;

尝试使用 os.system 意味着在调用 os.system 之前使用 os.chdir (为了避免“没有这样的文件或目录”的麻烦,我的 .sh 脚本包含一些相对引用),而且这种方法也是阻止我的终端输出。

尝试使用 Popen 并将主文件夹的所有路径传递给我的 .sh 导致启动僵尸进程而没有任何响应或其他。

希望能找到解决办法,

谢谢你们!

【问题讨论】:

标签: python bash parallel-processing


【解决方案1】:

你看过subprocess吗?便利函数 callcheck_output 阻塞,但默认的 Popen 对象不会:

processes = []
processes.append(subprocess.Popen(['script.sh']))
processes.append(subprocess.Popen(['script2.sh']))
...

return_codes = [p.wait() for p in processes]

【讨论】:

  • 我已经尝试过您的解决方案,但它引发了:Traceback (most recent call last): File "hotspot-generator.py", line 104, in <module> processes.append(subprocess.Popen(['run_all_synthetic2.sh'])) File "/usr/lib/python2.7/subprocess.py", line 710, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory
  • 查看stackoverflow.com/a/4798456/4571544 了解如何使用subprocess.Popen 运行shell 脚本
  • @panc_fab -- 您可能需要指定可执行文件的路径...例如Popen(['./run_all_synthetic2.sh'])
  • 感谢大家的支持,但您的所有回复似乎都不符合我的问题。我已经按照建议尝试使用 Popen,但这会导致进程僵化。可能是因为我在大学服务器上运行脚本,所以可能是我无法生成后台进程,或者该服务器上有一些严格的政策。
【解决方案2】:

你可以使用 GNU Parallel 吗?

ls test_scripts*.sh | parallel

或者:

parallel ::: script1.sh script2.sh ... script100.sh

GNU Parallel 是一种通用的并行化器,可以轻松地在同一台机器上或在您可以通过 ssh 访问的多台机器上并行运行作业。它通常可以替换 for 循环。

如果您想在 4 个 CPU 上运行 32 个不同的作业,那么并行化的直接方法是在每个 CPU 上运行 8 个作业:

GNU Parallel 会在完成后生成一个新进程 - 保持 CPU 处于活动状态,从而节省时间:

安装

如果没有为您的发行版打包 GNU Parallel,您可以进行个人安装,这不需要 root 访问权限。这样做可以在 10 秒内完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

有关其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README

了解详情

查看更多示例:http://www.gnu.org/software/parallel/man.html

观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

浏览教程:http://www.gnu.org/software/parallel/parallel_tutorial.html

注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel

【讨论】:

    猜你喜欢
    • 2013-03-14
    • 1970-01-01
    • 2017-01-11
    • 2012-11-24
    • 2017-11-04
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多