首页 > 解决方案 > If-then bash 语句作为 Python 子进程中的序列

问题描述

有没有办法if-then在 Python 子进程中将 bash 语句作为序列执行?我可以将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)

标签: pythonbashsubprocess

解决方案


if是一个 shell 关键字,而不是一个外部命令,所以你不应该使用列表参数;字符串必须由 shell 解析和执行。(您可以使用shell=True列表,但它有点毫无意义,因为Popen无论如何都必须将列表项连接成单个字符串。)

但是,对于此特定示例,您不需要 shellif语句,因为该-p选项mkdir将指示它仅在目录尚未退出时才创建目录。

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

此外,您根本不需要子进程,因为 Python 为创建目录的系统调用提供了自己的包装器。

try:
    os.mkdir("dir1")
except FileExistsError:
    pass

(捕获并忽略异常,而不是首先检查目录是否存在,以避免在您检查目录之后但在您实际尝试创建目录之前有人可以创建目录的竞争条件。)


推荐阅读