Python显示所有已安装的包

时间:2014-09-29 17:21:41

标签: python linux yum apt

有没有办法让python显示服务器上安装的所有apt / yum软件包?我有一个程序,只能抓取我指定的一个包,但我想知道是否有python-yum和python-apt之类的apt-show-versions / yum check-update模块在python中单包。

感谢。

编辑:

以下是我目前的代码:

# For finding the package version and using the package name -i
def aptpkg(package_name):
    cache = apt.Cache()
    pkg = cache[package_name]
    host = subprocess.Popen('hostname', stdout=subprocess.PIPE, universal_newlines=True).stdout.read().strip()
    if pkg.is_installed:
        print host
        print 'Current ' + package_name + ' installed:', pkg.installed.version
        con.execute("insert into ansible_packagelist(date, host, package_name, installed_version) values (current_timestamp,%s,%s,%s)", (host, package_name, pkg.installed.version,))
    else:
        print host, package_name + ' is not installed on this system.\n'
    if pkg.is_upgradable:
        print 'Upgradeable version of ' + package_name + ' :', pkg.candidate.version
        con.execute("update ansible_packagelist set upgradeable_version = %s where package_name = %s", (pkg.candidate.version, package_name))
    db.commit()

6 个答案:

答案 0 :(得分:5)

这是pythonic方式:

import apt
cache = apt.Cache()

for mypkg in apt.Cache():
    if cache[mypkg.name].is_installed:
        print mypkg.name

对于yum,我首先需要登录RH / Centos系统。 但你可以看一下yum库,你会找到像'rpmdb.searchNevra'这样的东西

答案 1 :(得分:3)

使用subprocess运行shell命令。

from subprocess import call

for apt:call(["dpkg", "-l"])

为yum:call(["yum list installed"])

答案 2 :(得分:1)

maxadamo的回答是正确的,但Cache初始化了两次,我不知道原因。

您只能实例化一个缓存,在其上循环并直接在for循环中访问pkg。您不需要额外的查找,因为您已经可以访问pkg的属性。

所以这是一种更多的Pythonic方式:

import apt
cache = apt.Cache()

for pkg in cache:
    if pkg.is_installed:
        print pkg.name

答案 3 :(得分:1)

import re

with open("/var/lib/dpkg/status", "r") as f:
    status = f.read()
    packages_installed = re.findall("Package: (.*)\nStatus: install ok installed", status)

您必须阅读有关dpkg包状态的信息。执行官:" man dpkg"并转到"有关包装的信息"部分。

我认为使用模块来解决某些问题是不必要的。它创建依赖(我不喜欢)。 "简单"脚本比使用apt模块的脚本更快。 比较 - :

a.py:

    import re

with open("/var/lib/dpkg/status", "r") as f:
        status = f.read()
        packages_installed = re.findall("Package: (.*)\nStatus: install ok installed", status)

b.py:

 import apt
cache = apt.Cache()

for pkg in cache:
    pass
#        if pkg.is_installed:
#            print pkg.name

时间:

/tmp » time python a.py
    python a.py  0,04s user 0,01s system 58% cpu 0,075 total
/tmp » time python b.py
    python b.py  3,07s user 0,09s system 75% cpu 4,205 total

如果唯一目标是获取已安装软件包的列表,则不需要使用apt模块。其他方式是使用subprocess和ejecute" dpkg -l",但我不是exec的朋友。

答案 4 :(得分:0)

如果有人想在“ import re”中使用答案

收到通知: 有些包有另一个标头

var query2 = from product in dbContext.Products
         join eventProduct in dbContext.EventProducts
             on new { pIndex = product.index, eIndex = currentEvent.index }
             equals new { pIndex = eventProduct.Product.index, eIndex = eventProduct.Event.index } into temp
         from eventProduct in temp.DefaultIfEmpty()
         select new { 
             Product = product,
             EventProduct = eventProduct
         };
var results = query2.ToList();
foreach(var r in results)
{
      r.EventProduct = r.EventProduct != null 
            ? r.EventProduct 
            : new EventProduct { .... set default values}
}

因此此代码不起作用

如果您仍要使用它,则需要进行如下更改:

Package: perl-base
Essential: yes
Status: install ok installed

答案 5 :(得分:0)

您可以使用pip listpip list > requirements.txt并手动处理文件以生成需求。