python - 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)
解决方案
if
是一个 shell 关键字,而不是一个外部命令,所以你不应该使用列表参数;字符串必须由 shell 解析和执行。(您可以使用shell=True
列表,但它有点毫无意义,因为Popen
无论如何都必须将列表项连接成单个字符串。)
但是,对于此特定示例,您不需要 shellif
语句,因为该-p
选项mkdir
将指示它仅在目录尚未退出时才创建目录。
p = subprocess.Popen(["mkdir", "-p", "dir1"])
此外,您根本不需要子进程,因为 Python 为创建目录的系统调用提供了自己的包装器。
try:
os.mkdir("dir1")
except FileExistsError:
pass
(捕获并忽略异常,而不是首先检查目录是否存在,以避免在您检查目录之后但在您实际尝试创建目录之前有人可以创建目录的竞争条件。)
推荐阅读
- python - 将多个元素索引从一个数组应用到另一个数组
- javascript - 当我添加 bootstrap4 cdn 时动画不起作用
- javascript - 如何在 GraphQL 中将值从 DB 返回到枚举类型
- fortran - Fortran 函数重塑的问题
- javascript - 无法填写动态生成的输入字段
- php - 如何使用 Laravel 7 Mail 向多个用户发送电子邮件?
- weasyprint - WeasyPrint 无法加载图像/css:名称解析暂时失败
- c++ - 宏不允许在其参数中使用逗号分隔的定义吗?
- gnuplot - 使用 multiplot 堆叠 XRD 图:讨论 eps 终端中出现的随机文本
- java - 升级 Eclipse 和 Java 后,带有 Freetts 的 Java 示例不起作用