if-then bash语句作为Python子进程中的序列

时间:2018-08-10 15:01:10

标签: python bash subprocess

有什么方法可以将if-then bash语句作为序列在Python子进程中执行? 我可以将if-then语句作为字符串执行,但是我想将其转换为序列以获取更安全的代码。

这是我目前的程序。它使用字符串作为带有shell=True参数的子流程的第一个输入。

# this example works
import subprocess
p = subprocess.Popen('if [ ! -d "dir1" ]; then mkdir dir1; fi;', shell=True)

我想将第一个参数转换为带有shell=False参数的序列,但是我不知道如何将上述语句作为序列。这就是我尝试过的。

# this example does not work
import subprocess
p = subprocess.Popen(['if','[ ! -d "dir1" ];','then','mkdir','dir1;','fi;'], shell=False)

1 个答案:

答案 0 :(得分:2)

if是一个shell关键字,而不是一个外部命令,因此您不应使用列表参数。该字符串必须由外壳程序解析和执行。 (您可以将shell=True与列表一起使用,但这毫无意义,因为Popen必须将列表项串联为单个字符串。)

但是,对于此特定示例,您不需要外壳if语句,因为-p的{​​{1}}选项将指示它仅在不创建目录时创建目录已经退出。

mkdir

此外,在 all 处不需要子进程,因为Python在创建目录的系统调用周围提供了自己的包装器。

p = subprocess.Popen(["mkdir", "-p", "dir1"])

(捕获并忽略该异常,而不是先检查目录是否存在,以避免出现竞争状况,即有人在检查目录之后但实际尝试创建目录之前可以创建目录。)