【问题标题】:Using "apt-get install xxx" inside Python script在 Python 脚本中使用“apt-get install xxx”
【发布时间】: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()

标签: python apt apt-get


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      相关资源
      最近更新 更多