10

根据操作系统,目前我需要使用 apt 或 rpm 安装一些软件包。我看到了 lib "apt" 来更新或升级系统,但可以用它来安装单个包吗?

我也试图使用“子进程”:

subprocess.Popen('apt-get install -y filetoinstall', shell=True, stdin=None, stdout=None, stderr=None, executable="/bin/bash")

但是这个命令显示了 shell 中的所有进程,我无法隐藏它。

感谢您的帮助。

4

5 回答 5

11

您可以check_callsubprocess库中使用。

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独立于平台,将/dev/null在 POSIX 和nulWindows 上返回(这与您正在使用无关,apt-get但仍然很高兴知道 :))

于 2011-12-12T22:47:18.200 回答
5

谢谢大家!我使用每个解决方案的一部分。我的代码:

proc = subprocess.Popen('apt-get install -y FILE', shell=True, stdin=None, stdout=open(os.devnull,"wb"), stderr=STDOUT, executable="/bin/bash")
proc.wait()

添加:标准输出和.wait

再次感谢您来自阿根廷!

于 2011-12-13T12:06:43.400 回答
3

对于这个特定的任务,作为替代方案,subprocess您可以考虑使用Fabric,这是一个用于自动构建的 python 部署工具。

于 2011-12-13T00:07:29.650 回答
1

这是对 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)
于 2019-09-26T00:30:40.913 回答
0

使用它来将输出重定向到 /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 完成。

于 2011-12-12T22:44:00.043 回答