运行 使用 python 子进程的 GNU 并行命令
Running a GNU parallel command using python subprocess
这是一个简单的 GNU 并行命令,它在名为“example_i[=34=”的现有目录中创建一个名为“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 (the RunModel module 来对交给我的 Fortran 代码进行不确定性量化。虽然这与问题没有直接关系,但它是相关的,因为我想知道如何使用 这些 工具来实现它,因为我无权更改它们。
根据@Mark Setchell 的评论,确实在 POSIX 上默认未使用 bash
,如 documentation for subprocess 中所示。这通过将我的 python 代码片段重写为
来明确告诉 subprocess
使用 bash
来解决
import subprocess
cmd = "parallel -j 4 'cd example_{} && touch example_{}.txt' ::: {1..4}"
subprocess.run(cmd, shell=True, executable='/bin/bash')
需要注意的是,虽然参数 executable
在这里被用在 subprocess.run()
调用中,但它并不是 class 的直接一部分。 executable
参数实际上是 subprocess.Popen()
class 的一部分,但 subprocess.run()
可以通过 **other_popen_kwargs
参数访问它。
这是一个简单的 GNU 并行命令,它在名为“example_i[=34=”的现有目录中创建一个名为“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 (the RunModel module 来对交给我的 Fortran 代码进行不确定性量化。虽然这与问题没有直接关系,但它是相关的,因为我想知道如何使用 这些 工具来实现它,因为我无权更改它们。
根据@Mark Setchell 的评论,确实在 POSIX 上默认未使用 bash
,如 documentation for subprocess 中所示。这通过将我的 python 代码片段重写为
subprocess
使用 bash
来解决
import subprocess
cmd = "parallel -j 4 'cd example_{} && touch example_{}.txt' ::: {1..4}"
subprocess.run(cmd, shell=True, executable='/bin/bash')
需要注意的是,虽然参数 executable
在这里被用在 subprocess.run()
调用中,但它并不是 class 的直接一部分。 executable
参数实际上是 subprocess.Popen()
class 的一部分,但 subprocess.run()
可以通过 **other_popen_kwargs
参数访问它。