Доброй ночи ЛОРовцам. Пишу небольшой скрипт и в нём мне нужна функция, которая будет проверять установлен ли пакет в системе (в Debian-подобной). Работает так: открываю новый процесс, там 'dpkg -s <пакет>', ищу ввв выводе Status, сравниваю и возвращаю True/False.
В чем проблема: дочерний процесс (dpkg) выводит в stdout скрипта результат выполнения, ведь он наследует открытые дескрипторы.
Мне нужно читать этот вывод (от dpkg), но что бы он не засорял вывод скрипта.
Код:
#!/usr/bin/env python3
import sys
from subprocess import Popen, PIPE
def is_installed(pkg):
proc = Popen(['dpkg', '-s', pkg], stdout=PIPE)
proc.wait()
output = str(proc.stdout.read())
if not output.find("Status: install ok installed") == -1:
return True
else:
return False
print(is_installed(sys.argv[1]))
Есть одна особенность: он (дочерний процесс) пихает свой вывод в мой вывод только в случае неудачи dpkg (то есть если пакет не установлен). Если функция возвращает False, то перед False у меня весь вывод дочернего процесса (dpkg), иначе у меня просто вывод из одной строки — 'True'. Я не пойму с чем это связанно.
Вывод:
nrdgrauf@localhost: ~ > ./test.py wine
True
nrdgrauf@localhost: ~ > ./test.py vim
dpkg-query: package 'vim' is not installed and no information is available
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.
False
nrdgrauf@localhost: ~ > dpkg -s vim
dpkg-query: package 'vim' is not installed and no information is available
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.
nrdgrauf@localhost: ~ >
P.S. — Приму любые улучшения кода, т.к. в Python почти полный 0x0.