python - 使用 python 子进程运行 GNU 并行命令

标签 python bash multiprocessing subprocess gnu-parallel

这是一个简单的 GNU 并行命令,它在名为“example_i”的现有目录中创建一个名为“example_i.txt”的文件。它执行此操作四次,i 从 1 到 4,每个核心执行一项作业:

parallel -j 4 'cd example_{} && touch example_{}.txt' ::: {1..4}

我知道这不是很令人兴奋。当我尝试使用子进程模块通过 python (v3.9) 运行它时,出现问题,如下所示:

import subprocess
cmd = "parallel -j 4 'cd example_{} && touch example_{}.txt' ::: {1..4}"
subprocess.run(cmd, shell=True)

这样做时我收到此错误:

/bin/sh: 1: cd: can't cd to example_{1..4}

看起来像使用 python 子进程调用,bash 没有作为 GNU 并行命令正确触发调用。相反,它显式替换 {1..4} 而不是将其划分为四个作业。

我还尝试使用不太建议的 os.system(cmd) 语法进行此操作,但得到了相同的错误。

PS:就上下文而言,这个问题源于我尝试使用 UQpy (特别是 RunModel module)用于对交给我的 Fortran 代码进行不确定性量化。虽然这与问题没有直接关系,但它是相关的,因为我想知道如何使用这些工具来实现此目的,因为我无权更改它们。

最佳答案

根据@Mark Setchell 的评论,确实看起来 bash POSIX 上默认不使用,如 documentation for subprocess 中所示。 。通过明确告诉subprocess可以解决这个问题。使用bash将我的 python 代码片段重写为:

import subprocess
cmd = "parallel -j 4 'cd example_{} && touch example_{}.txt' ::: {1..4}"
subprocess.run(cmd, shell=True, executable='/bin/bash')

需要注意的是,虽然参数executable在这里被用于 subprocess.run()调用,它不直接属于此类。 executable参数实际上是 subprocess.Popen() 的一部分类,但可以访问 subprocess.run()通过**other_popen_kwargs论证。

关于python - 使用 python 子进程运行 GNU 并行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69198548/

相关文章:

python - Django Rest Framework - CreateAPIView ForeignKey 查找字段

python - 字典中的重复项(Python)

python - 分箱后如何对数字列表的内容进行配对

linux - 这个命令 ls 的作用是什么。 | xargs -i -t cp ./{} $1

python - 使用 multiprocessing.Process 时 Tkinter GUI 卡住

python - 局部变量未以与 Python 中的共享内存对象相同的方式在循环中更新

python - 应用引擎 : map form data to url

linux - 想要制作一个shell脚本

python - 当存在使用多处理模块的事件套接字连接时 Flask 服务器不工作

bash - 测试目录是否存在于 makefile 中