2014-09-29 3 views
2

python이 서버에 설치된 모든 apt/yum 패키지를 표시 할 수있는 방법이 있습니까? 파이썬 - yum과 python-apt가 단일 패키지 만하기 때문에 파이썬에서 모듈과 비슷한 apt-show-versions/yum 확인 업데이트가 있는지 알고 싶습니다. .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

현재 가지고있는 코드를 붙여 넣을 수 있습니까? –

+1

'[p.is_installed이면 apt_pkg.packages in p] 해 ​​보셨습니까? ' http://apt.alioth.debian.org/python-apt-doc/library/apt_pkg.html#apt_pkg.packages – Dunes

답변

5

이것은 파이썬 방법입니다 : 냠를 들어

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

3

사용 subprocess 쉘 명령을 실행 : 여기

내가 현재 가지고있는 코드입니다. APT에 대한

from subprocess import call 

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

냠에 대한이 : call(["yum list installed"])

+0

도움을 주셔서 감사합니다.하지만 주위에 bash 작업이 아닌 모듈을 찾고 있습니다. – Nvasion

+1

@Nvasion 어쩌면 당신은'import socket; host = socket.gethostname();'을 사용하여 호스트 이름 하위 프로세스를 피하십시오. – Dunes

1

maxadamo의 대답은 정확하지만 Cache은 두 번 초기화되고 이유를 알 수 없습니다.

대신 하나의 캐시 만 인스턴스화하고 루프를 반복하여 for 루프에서 직접 pkg에 액세스 할 수 있습니다. pkg의 속성에 이미 액세스 할 수 있으므로 추가 조회가 필요하지 않습니다.

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를 패키지 상태를 읽을 수 있습니다

그래서 여기보다 파이썬 방법입니다. Exec : "man dpkg"및 "INFORMATION ABOUT PACKAGES"섹션으로 이동하십시오.

몇 가지 문제에 대한 모듈 사용은 불필요하다고 생각합니다. 의존성을 만듭니다 (나는 그다지 좋아하지 않습니다). 그리고 "간단한"스크립트는 apt 모듈을 사용하는 스크립트보다 빠릅니다. Comparation :

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의 친구가 아니다.

관련 문제