2015-07-21 7 views
2

Может ли быть pythonic способ получить установленные версии/версии программного обеспечения в системе Linux?Сценарий Python для извлечения установленного программного обеспечения на ПК Linux

Или должен быть другой подход для разных платформ, таких как Ubuntu, Fedora, CentOS и т. Д.?

+1

http://www.cyberciti.biz/faq/find-out-if-package-is-installed-in-linux/ –

ответ

0

Нет, нет никакого «пуфонического» способа сделать это. Вы можете использовать инструменты установленного менеджера пакетов для поиска пакетов.

Я создал код, чтобы сделать некоторые из этого. Он поддерживает только dpkg (используется в Debian и Ubuntu) и homebrew (используется в Mac OS X), но легко добавить других менеджеров пакетов.

import re 
import subprocess 

PACKAGE_MANAGERS = { 
    # "command": "test if package ? exists"-commnad 
    "dpkg": "dpkg -s ?", 
    "brew": "brew ls ?" 
    # just add new package managers here 
} 

def find_package_manager(): 
    for pm in PACKAGE_MANAGERS.keys(): 
     if subprocess.call(["which", pm], stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0: 
      return pm 
    raise OSError("Unable to find package manager.") 

def is_package_installed(name): 
    return subprocess.call(PACKAGE_MANAGERS[find_package_manager()].replace("?", name)+" > /dev/null 2>&1", shell=True) == 0 

def detect_package_version(name): 
    if not is_package_installed(name): 
     raise OSError("Unable to find package.") 
    try: 
     x = subprocess.check_output(name+" --version > /dev/null 2>&1", shell=True) 
    except subprocess.CalledProcessError: 
     pass 
    else: 
     a = re.findall("\\d+\\.\\d+\\.\\d+", x) 
     if len(a) > 0: 
      return a[0] 
     b = re.findall("\\d+\\.\\d+", x) 
     if len(b) > 0: 
      return b[0] 

print is_package_installed("python") 
print detect_package_version("python") 

Извините, это немного клочья.

Поскольку почти все программы предоставляют переключатель --version, я использую его для определения версии пакета. Вы можете использовать инструменты менеджера пакетов для этого.

+0

'shutil.which' не существует в python2. –

Смежные вопросы