【问题标题】:Check if a Debian package is installed from Python检查是否从 Python 安装了 Debian 软件包
【发布时间】:2021-03-27 17:39:04
【问题描述】:

是否有一种优雅且更像 Python 的方法来检查软件包是否安装在 Debian 上?

在 bash 脚本中,我会这样做:

dpkg -s packagename | grep Status

建议在 Python 脚本中做同样的事情?

【问题讨论】:

    标签: python debian


    【解决方案1】:

    这是一种pythonic方式:

    import apt
    cache = apt.Cache()
    if cache['package-name'].is_installed:
        print "YES it's installed"
    else:
        print "NO it's NOT installed"
    

    【讨论】:

    • 如果未安装软件包,您会收到一个关键错误。如果找不到包,还有另一种方法可以捕捉到这一点并提供更整洁的输出。我会将其作为评论发布给 OP。
    【解决方案2】:

    你的 bash 示例的一个更好的、希望是惯用的版本:

    import os, subprocess
    devnull = open(os.devnull,"w")
    retval = subprocess.call(["dpkg","-s","coreutils"],stdout=devnull,stderr=subprocess.STDOUT)
    devnull.close()
    if retval != 0:
        print "Package coreutils not installed."
    

    【讨论】:

    • 这是错误的。如果包处于deinstall ok config-files 状态,dpkg -s 也将成功返回(零退出),即包已安装。
    【解决方案3】:

    如果您正在检查是否存在安装 Python 模块的包,您可以在依赖的 Python 脚本中对此进行测试 - 尝试导入它并查看是否出现异常:

    import sys
    try:
        import maybe
    except ImportError:
        print "Sorry, must install the maybe package to run this program."
        sys.exit(1)
    

    【讨论】:

    • 这些不是 OP 正在寻找的包。 Python 包和 Debian 的包管理器的包(很大程度上)是不同的东西。见:en.wikipedia.org/wiki/Dpkg
    • 好吧,OP 确实询问了 Python 脚本中是否有方法,所以我认为认为他正在寻找一种检测 Python 模块的方法并不过分依赖。尽管如此,我还是希望我能更恰当地限定我的答案。
    • Google 派我到这里来寻找这个答案,非常感谢。
    【解决方案4】:

    这是一些代码,可以让您以简洁的方式显示软件包是否已安装(不会在屏幕上触发混乱的错误消息)。不过,这只适用于 Python 3。

    import apt
    cache = apt.Cache()
    cache.open()
    
    response = "Package Installed."
    try:
        cache['notapkg'].is_installed
    except KeyError:
        response = "Package Not Installed."
    
    print(response)
    

    【讨论】:

      【解决方案5】:

      看看commands。这对于在命令行上运行并获取状态非常有用。

      否则,我确信有一些库可以让您与 apt 交互。 python-apt 可能有用,但有点生硬。仅捕获命令行似乎更容易。

      【讨论】:

        【解决方案6】:

        我需要一个跨平台兼容的解决方案,所以我最终使用了which

        import subprocess
        retval = subprocess.call(["which", "packagename"])
        if retval != 0:
            print("Packagename not installed!")
        

        虽然它不像上面的答案那样 Pythonic,但它确实适用于大多数平台。

        【讨论】:

        • 您的解决方案可能适用于 wget 等软件包,但不适用于 coreutils 等软件包
        【解决方案7】:

        受先前答案的启发,这对 Python 2 和 Python 3 都适用,并且避免了关键错误的 try/catch:

        import apt
        package = 'foo' # insert your package name here
        cache = apt.Cache()
        package_installed = False
        
        if package in cache:
            package_installed = cache[package].is_installed
        

        【讨论】:

        • 在 conda 基础环境中(使用 Anaconda3)import apt 给出错误:ModuleNotFoundError: No module named 'apt'。什么是最合适的解决方案?
        【解决方案8】:

        我也有同样的疑问。搜索了互联网的每个角落,但找不到。 但最后经过一些实验我做到了!

        • 代码:
        1. import os
        2. packagename = "figlet" # Type in your package name
        3. os.system("dpkg -s "+packagename" | grep Status")

        使用 python 代码在任何终端输入:

        • 代码:
        1. import os
        2. os.system("YOUR TERMINAL COMMAND HERE")

        【讨论】:

        • 除非有特殊情况,否则没有理由使用 grep。只需阅读退出代码。 def test_dpkgInstalled(packageName): return (os.system("dpkg -s " + packageName + "> /dev/null 2>&1")) == 0
        猜你喜欢
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 2012-02-15
        • 2014-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-16
        相关资源
        最近更新 更多