这是一个简单的 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/