如何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")