2014-09-29 71 views
2

有沒有辦法讓python顯示安裝在服務器上的所有apt/yum軟件包?我有一個程序,只能抓住一個我指定的包,但我想知道是否有像python模塊apt-show-versions/yum check-update,因爲python-yum和python-apt只能做單個包。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() 
+0

你可以粘貼你目前擁有的代碼嗎? – 2014-09-29 17:47:32

+1

您是否嘗試過'[p for apt_pkg.packages如果p.is_installed]'? http://apt.alioth.debian.org/python-apt-doc/library/apt_pkg.html#apt_pkg.packages – Dunes 2014-10-10 21:09:12

回答

5

這是Python的方式:

import apt 
cache = apt.Cache() 

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

對於百勝,我需要先登錄到RH/CentOS系統。 但你可以看看yum庫,你會發現像'rpmdb.searchNevra'

+0

感謝這工作。 – Nvasion 2015-11-20 22:45:03

3

使用subprocess運行shell命令。

from subprocess import call 

爲貼切:call(["dpkg", "-l"])

爲百勝:call(["yum list installed"])

+0

感謝您的幫助,但我正在尋找一個模塊,而不是一個工作。 – Nvasion 2014-10-10 20:42:28

+1

@Nvasion也許你想使用'import socket; host = socket.gethostname();'以避免主機名子進程。 – Dunes 2014-10-10 21:13:02

1

maxadamo的答案是正確的,但Cache初始化兩次,我不知道爲什麼。

您可以僅實例化一個高速緩存,將其循環並直接在for循環中訪問pkg。您不需要額外的查找,因爲您已經可以訪問pkg的屬性。

所以這裏有一個更Python的方式:

import apt 
cache = apt.Cache() 

for pkg in cache: 
    if pkg.is_installed: 
     print pkg.name 
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模塊是沒有必要的。其他方式是使用子進程和ejecute「dpkg -l」,但我不是exec的朋友。

相關問題