在 Python 脚本中使用“apt-get install xxx”
Posted
技术标签:
【中文标题】在 Python 脚本中使用“apt-get install xxx”【英文标题】:Using "apt-get install xxx" inside Python script 【发布时间】:2012-01-18 21:31:57 【问题描述】:目前我需要根据操作系统使用 apt 或 rpm 安装一些软件包。 我看到了 lib "apt" 来更新或升级系统,但是可以用它来安装单个包吗?
我也尝试使用“子进程”:
subprocess.Popen('apt-get install -y filetoinstall', shell=True, stdin=None, stdout=None, stderr=None, executable="/bin/bash")
但是这个命令显示了shell中的所有进程,我无法隐藏它。
感谢您的帮助。
【问题讨论】:
看来您没有正确获得分叉。您是否尝试过阅读文档? 对于 Python 3.5+,请参阅subprocess.run()
【参考方案1】:
使用它来将输出重定向到 /dev/null:
proc = subprocess.Popen('apt-get install -y filetoinstall', shell=True, stdin=None, stdout=open("/dev/null", "w"), stderr=None, executable="/bin/bash")
proc.wait()
对 .wait() 的调用将一直阻塞,直到 apt-get 完成。
【讨论】:
啊,谢谢,但是我怎样才能停止程序,等待apt完成安装,以及何时安装,使用其他功能? 谢谢大家!我使用每个解决方案的一部分。我的代码: proc = subprocess.Popen('apt-get install -y FILE', shell=True, stdin=None, stdout=open(os.devnull,"wb"), stderr=STDOUT, executable="/bin/ bash") proc.wait() 添加:stdout 和 .wait 再次感谢您【参考方案2】:您可以使用subprocess
库中的check_call
。
from subprocess import STDOUT, check_call
import os
check_call(['apt-get', 'install', '-y', 'filetoinstall'],
stdout=open(os.devnull,'wb'), stderr=STDOUT)
将stdout
转储到/dev/null
,或在本例中为os.devnull
。
os.devnull
与平台无关,将在 POSIX 上返回 /dev/null
,在 Windows 上返回 nul
(这不相关,因为您使用的是 apt-get
,但仍然很高兴知道 :))
【讨论】:
谢谢大家!我使用每个解决方案的一部分。我的代码: proc = subprocess.Popen('apt-get install -y FILE', shell=True, stdin=None, stdout=open(os.devnull,"wb"), stderr=STDOUT, executable="/bin/ bash") proc.wait() 添加:stdout 和 .wait 再次感谢您 这对我有用。我想建议使用 try 和 except 块,以便在出现错误时它会告诉您问题所在,而不仅仅是说有错误。我在下面添加了一个答案作为补充。【参考方案3】:对于这个特定任务,作为subprocess
的替代方案,您可以考虑使用Fabric,这是一种用于自动构建的python 部署工具。
【讨论】:
您共享的链接给出了这个:权限被拒绝 您没有查看此页面的适当权限。请联系此项目的所有者以请求许可。【参考方案4】:谢谢大家!我使用每个解决方案的一部分。我的代码:
proc = subprocess.Popen('apt-get install -y FILE', shell=True, stdin=None, stdout=open(os.devnull,"wb"), stderr=STDOUT, executable="/bin/bash")
proc.wait()
添加:stdout 和 .wait
再次感谢您来自阿根廷!
【讨论】:
【参考方案5】:这是对 Russell Dias 接受的答案的补充。这会添加一个 try 和 except 块来输出可操作的错误信息,而不仅仅是说明存在错误。
from subprocess import check_call, CalledProcessError
import os
try:
check_call(['apt-get', 'install', '-y', 'filetoinstall'], stdout=open(os.devnull,'wb'))
except CalledProcessError as e:
print(e.output)
【讨论】:
以上是关于在 Python 脚本中使用“apt-get install xxx”的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 脚本文件中使用 shell 脚本中的变量?
在 QT Creator 中使用 C++ 调用 Python 脚本