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

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

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

答案1

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

我更喜欢使用subprocess.check_output()这样你就可以分析打印到标准输出的内容:

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

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

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

如果您发现自己从 Python 执行了很多(不同的)命令调用,您可能需要查看。这样你就可以使(IMO)更具可读性:

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

res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()

答案2

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

例子:

bashCommand = "sudo apt update"
output = subprocess.check_output(['bash','-c', bashCommand])

答案3

子流程模块旨在执行以下操作:

import subprocess
subprocess.call(["sudo", "apt", "update"])

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

subprocess.check_call(["sudo", "apt", "update"])

答案4

对于 python 3.5 及更高版本,您可以使用:

import subprocess

try:        
    result = subprocess.run("sudo apt update", check=True, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except subprocess.CalledProcessError as err:
    raise Exception(str(err.stderr.decode("utf-8")))
except Exception as err:
    raise Exception(err)
else:
    return result.stdout.decode("utf-8")

相关内容