有什么方法可以将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)
答案 0 :(得分:2)
if
是一个shell关键字,而不是一个外部命令,因此您不应使用列表参数。该字符串必须由外壳程序解析和执行。 (您可以将shell=True
与列表一起使用,但这毫无意义,因为Popen
必须将列表项串联为单个字符串。)
但是,对于此特定示例,您不需要外壳if
语句,因为-p
的{{1}}选项将指示它仅在不创建目录时创建目录已经退出。
mkdir
此外,在 all 处不需要子进程,因为Python在创建目录的系统调用周围提供了自己的包装器。
p = subprocess.Popen(["mkdir", "-p", "dir1"])
(捕获并忽略该异常,而不是先检查目录是否存在,以避免出现竞争状况,即有人在检查目录之后但实际尝试创建目录之前可以创建目录。)