如何在python脚本中执行bash命令

Dre*_*mor 21 scripting bash python

如何sudo apt update从 python 脚本启动带有多个参数(例如“ ”)的 bash 命令?

Ant*_*hon 22

@milne 的回答有效,但subprocess.call()给你的反馈很少。

我更喜欢使用,subprocess.check_output()以便您可以分析打印到 stdout 的内容:

 import subprocess
 res = subprocess.check_output(["sudo", "apt", "update"])
 for line in res.splitlines():
     # process the output line by line
Run Code Online (Sandbox Code Playgroud)

check_output 在调用命令的零退出时引发错误

请注意,bash如果您没有shell为函数指定关键字参数,则这不会调用或其他 shell (对于 也是如此subprocess.call(),如果没有必要,您不应该这样做,因为它会带来安全隐患),它会直接调用命令。

如果您发现自己在 Python 中执行了很多(不同的)命令调用,您可能需要查看plumbum。有了它,您可以使(IMO)更具可读性:

from plumbum.cmd import sudo, apt, echo, cut

res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
Run Code Online (Sandbox Code Playgroud)

  • @alper 阅读 0324 https://www.python.org/dev/peps/pep-0324/。尽管 `os.system` 和 `os.popen` 已经存在,这解释了制作 `subprocess` 的基本原理。这样的 PEP 很难被接受。有几个人对此的考虑比你或我要多得多。自 2003 年以来,`subprocess` 已经改进,其他的只是为了向后兼容。你红了`os.system` 手册页: *subprocess 模块提供了更强大的工具来产生新的进程和检索它们的结果;使用该模块比使用此功能更可取。* (2认同)

小智 12

您可以将 bash 用作程序,并使用参数 -c 来执行命令:

例子:

bashCommand = "sudo apt update"
output = subprocess.check_output(['bash','-c', bashCommand])
Run Code Online (Sandbox Code Playgroud)


Mil*_*are 9

模块的设计要做到这一点:

import subprocess
subprocess.call(["sudo", "apt", "update"])
Run Code Online (Sandbox Code Playgroud)

如果您希望脚本在命令失败时终止,您可以考虑使用check_call()而不是自己解析返回码:

subprocess.check_call(["sudo", "apt", "update"])
Run Code Online (Sandbox Code Playgroud)

  • 你忘了方括号 (3认同)