从Python脚本中并行运行Bash脚本

3

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

我的脚本在某一点上必须运行一些用Bash编写的测试脚本,并且我必须并行执行它们并等待它们结束。 我已经尝试过以下方法:

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

在for循环内部但并没有起作用。

有什么建议吗?

谢谢!

编辑

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

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

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

希望找到一个解决方案,

谢谢大家!


你有查看过 thread 模块吗?https://docs.python.org/2/library/thread.html 或者 multiprocessing 模块?https://docs.python.org/2/library/multiprocessing.html - RattleyCooper
脚本的标准输出(stdout)和错误输出(stderr)你希望发生什么? - tdelaney
2个回答

3

你看过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 - panc_fab
点击这个链接 https://dev59.com/pFPTa4cB1Zd3GeqPl7gK#4798456,了解如何使用```subprocess.Popen```运行shell脚本。 - dekkard
@panc_fab -- 你可能需要指定可执行文件的路径...例如 Popen(['./run_all_synthetic2.sh']) - mgilson
谢谢大家的支持,但似乎你们所有的回复都不适用于我的问题。我已经尝试了建议中的Popen,但这导致了僵尸进程。可能是因为我在大学服务器上运行脚本,所以我可能无法生成后台进程,或者该服务器有一些严格的策略限制。 - panc_fab

2

你能使用GNU Parallel吗?

ls test_scripts*.sh | parallel

或者:

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

GNU Parallel是一个通用的并行化工具,可以轻松地在同一台机器或多台具有ssh访问权限的机器上并行运行作业。它经常可以替代for循环。

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

简单调度

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

GNU Parallel调度

安装

如果您的发行版中没有打包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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接