在 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 脚本中使用 awscli?

如何在 python 脚本文件中使用 shell 脚本中的变量?

在 QT Creator 中使用 C++ 调用 Python 脚本

无法在另一个 python 脚本中使用来自 python 函数的属性

在 python 脚本中使用 ssh 代理

使用Runtime.getRuntime().exec()在java中调用python脚本