【发布时间】:2021-03-27 17:39:04
【问题描述】:
是否有一种优雅且更像 Python 的方法来检查软件包是否安装在 Debian 上?
在 bash 脚本中,我会这样做:
dpkg -s packagename | grep Status
建议在 Python 脚本中做同样的事情?
【问题讨论】:
是否有一种优雅且更像 Python 的方法来检查软件包是否安装在 Debian 上?
在 bash 脚本中,我会这样做:
dpkg -s packagename | grep Status
建议在 Python 脚本中做同样的事情?
【问题讨论】:
这是一种pythonic方式:
import apt
cache = apt.Cache()
if cache['package-name'].is_installed:
print "YES it's installed"
else:
print "NO it's NOT installed"
【讨论】:
你的 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 也将成功返回(零退出),即包未已安装。
如果您正在检查是否存在安装 Python 模块的包,您可以在依赖的 Python 脚本中对此进行测试 - 尝试导入它并查看是否出现异常:
import sys
try:
import maybe
except ImportError:
print "Sorry, must install the maybe package to run this program."
sys.exit(1)
【讨论】:
这是一些代码,可以让您以简洁的方式显示软件包是否已安装(不会在屏幕上触发混乱的错误消息)。不过,这只适用于 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)
【讨论】:
看看commands。这对于在命令行上运行并获取状态非常有用。
否则,我确信有一些库可以让您与 apt 交互。 python-apt 可能有用,但有点生硬。仅捕获命令行似乎更容易。
【讨论】:
我需要一个跨平台兼容的解决方案,所以我最终使用了which。
import subprocess
retval = subprocess.call(["which", "packagename"])
if retval != 0:
print("Packagename not installed!")
虽然它不像上面的答案那样 Pythonic,但它确实适用于大多数平台。
【讨论】:
受先前答案的启发,这对 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
【讨论】:
import apt 给出错误:ModuleNotFoundError: No module named 'apt'。什么是最合适的解决方案?
我也有同样的疑问。搜索了互联网的每个角落,但找不到。 但最后经过一些实验我做到了!。
import ospackagename = "figlet" # Type in your package nameos.system("dpkg -s "+packagename" | grep Status")使用 python 代码在任何终端输入:
import osos.system("YOUR TERMINAL COMMAND HERE")【讨论】:
def test_dpkgInstalled(packageName): return (os.system("dpkg -s " + packageName + "> /dev/null 2>&1")) == 0