编写 Python shell 脚本时使用 subprocess.call() 或 os.system() 是否不好?

Pat*_*ick 7 python linux scripting

我正在研究 Python 是否可以替代 Bash 以用于 shell 脚本编写。我已经看到Python可以使用subprocess.call()或os.system()执行Linux命令。但我在某处读过(忘记了文章的链接),使用这些是一件坏事。这是真的吗?

如果是的话,那为什么这是一件坏事呢?

如果不是,那么可以肯定地说 Python 确实可以替代 Bash 来编写脚本,因为我可以使用这两个函数调用中的任何一个来执行 Linux 命令?

注意:如果我没有记错的话, os.system() 已被弃用,应该使用 subprocess.call() 代替,但这不是问题的要点。

Cha*_*ffy 3

使用os.system()subprocess.call(..., shell=True)不能替换外壳,因为它们实际上使用了外壳。

os.system("foo")实际上调用sh -c "foo"——也就是说,它foo作为 shell 脚本运行。因此,使用它绝不是取代shell。对于 来说也是如此subprocess.call("foo", shell=True)


使用subprocess.Popen该系列中的 和 函数可以替代 shell,但这通常会导致代码冗长且难以处理。

考虑以下 shell 脚本:

#!/bin/sh
foo "$1" | bar "$2"
Run Code Online (Sandbox Code Playgroud)

现在,让我们看看如何在 Python 中以不启动任何 shell 的方式重现该内容:

#!/usr/bin/env python
import subprocess, sys

p1 = subprocess.Popen(["foo", sys.argv[1]], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["bar", sys.argv[2]], stdin=p1.stdout)
sys.exit(p2.wait())
Run Code Online (Sandbox Code Playgroud)

我们从 19 个字符(在 shebang 之后)增加到 148 个字符(在 shebang 和导入之后)——这是一个完全琐碎的脚本,没有使用更高级的功能,例如进程替换、命令替换等。