В версии питона 3.2.2 работает такой вариант (добавлен импорт copy, изменён соответственно метод списка, убраны все вхождения "sep="):
#!/usr/bin/python3
import subprocess
import sys
import copy
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)
def getDependency(package):
if package == "":
return None
# resp = subprocess.check_output(["/bin/sh", "-c", "apt-cache depends "+ package +" | grep -v '<' | grep -v Требует | sort | uniq | sed 's/-[^-]*-[^-]*$//'"],universal_newlines=True);
resp = subprocess.check_output(["rpm", "--requires", "--qf", "'%{REQUIRENAME}'", "-q", package],
universal_newlines=True);
s = str(resp);
# eprint(s)
if s and len(s.strip()) > 0:
return s.replace("'", "").split("\n")
else:
return None
def getAllpackages():
resp = subprocess.check_output(["rpm", "-qa", "--qf", "'%{name}\n'"], universal_newlines=True);
s = str(resp)
return s.replace("'", "").split("\n")
def getWhatReq(package):
# args = ["/bin/sh", "-c", "apt-cache whatdepends " + package + " | grep -v '<' | grep -v Требует | sort | uniq | sed 's/-[^-]*-[^-]*$//'"]
# resp = subprocess.check_output(["rpm", "--whatrequires", "--qf", "'%{name}\n'", "-q", package ],universal_newlines=True, stderr=None)
args = ["/bin/sh", "-c",
"rpm --test -e " + package + " 2>&1 >/dev/null | egrep -o -e 'для.+' | sed 's/для //' | sed 's/-[^-]*-[^-]*$//'"]
resp = subprocess.check_output(args, universal_newlines=True, stderr=None)
s = str(resp).strip("\n");
if s and len(s.strip()) > 0:
return s.replace("'", "").split("\n")
else:
return None
candidats = {}
all = getAllpackages()
blacklist = set() # set(["dbus","control","grep","sed","samba_common","samba-client","udev","shadow-utils","tcb-utils","pam0-tcb","nss_tcb"])
whitelist = set()
def process_pckg_list(pckg_list):
# eprint(blacklist)
for package in pckg_list:
try:
dep = candidats[package]
hasBefore = True
except KeyError:
dep = set()
candidats[package] = dep
hasBefore = False
try:
list = getDependency(package)
if list == None:
return True
except subprocess.CalledProcessError:
eprint("erron while processing :", package)
# xtree.pop(package)
return False
for s in list:
s = s.strip()
if len(s) == 0:
continue
if "(" in s:
continue
if "/" in s:
continue
try:
pname = s.strip().split()[0].strip()
except IndexError:
eprint("index error:", s)
continue;
if pname in blacklist:
continue
# print(package, "::", s,"->",pname)
dep.add(pname)
if pname not in candidats:
status = process_pckg_list([pname])
if not status:
try:
if not hasBefore:
eprint("blacklist:", pname);
blacklist.add(pname)
del candidats[pname]
except KeyError:
pass
return True
def main():
args = sys.argv # [-1]
args.pop(0)
args1 = set(copy.copy(args))
for p in args:
if p[-1]== '+':
whitelist.add(p[0:-1])
try :
args1.remove(p)
except KeyError:
pass
continue
deps = getWhatReq(p)
if deps:
args1 = args1.union(set(deps))
# args1 = deps(set(args1))
args1 -= whitelist
eprint(args1)
# eprint(blacklist)
eprint(whitelist)
process_pckg_list(args1)
# main(["Ristetto"])
# print(len(candidats))
# print(candidats)
# print("------------------")
needNextPass = False
passCount = 1
class NeedPassException(Exception):
pass
dep_cache = {}
# eprint(candidats)
while (True):
# eprint ("------------pass ", passCount)
passCount += 1
needNextPass = False
try:
for p in candidats:
try:
deps = dep_cache[p]
except KeyError:
try:
deps = getWhatReq(p)
dep_cache[p] = deps
except subprocess.CalledProcessError:
# eprint("p=",p)
dep_cache[p] = []
continue
if deps == None:
# eprint("getWhatReq(",p ,") return None" )
continue
for r in deps:
r = r.strip()
if len(r) == 0:
continue
if r == p:
# eprint("skip [" + r + "]")
continue
if r in whitelist:
continue
if r not in all:
continue
if r not in candidats:
needNextPass = True
xlist = candidats[p]
for c1 in xlist:
try:
del candidats[c1]
# eprint("removed ",c1)
except KeyError:
pass
try:
del candidats[p]
# eprint("removed ", p)
except KeyError:
pass
raise NeedPassException
pass
pass
except NeedPassException:
continue
if not needNextPass:
break
pass
result = ''
eprint("Всего найдено пакетов для удаления:", len(candidats.keys()))
for s in candidats.keys():
result = result + s + " ";
print(result)
if __name__ == "__main__":
main()
Но вот результат работы удручающий, rpm вместо списка имён пакетов даёт сами библиотеки:
$ ./DepTree5.py medit
{'medit'}
set()
предупреждение: пакет libICE.so.6 не установлен
erron while processing : libICE.so.6
blacklist: libICE.so.6
предупреждение: пакет libSM.so.6 не установлен
erron while processing : libSM.so.6
blacklist: libSM.so.6
предупреждение: пакет libX11.so.6 не установлен
erron while processing : libX11.so.6
blacklist: libX11.so.6
предупреждение: пакет libatk-1.0.so.0 не установлен
erron while processing : libatk-1.0.so.0
blacklist: libatk-1.0.so.0
предупреждение: пакет libcairo.so.2 не установлен
erron while processing : libcairo.so.2
blacklist: libcairo.so.2
предупреждение: пакет libgdk-x11-2.0.so.0 не установлен
erron while processing : libgdk-x11-2.0.so.0
blacklist: libgdk-x11-2.0.so.0
предупреждение: пакет libgdk_pixbuf-2.0.so.0 не установлен
erron while processing : libgdk_pixbuf-2.0.so.0
blacklist: libgdk_pixbuf-2.0.so.0
предупреждение: пакет libgio-2.0.so.0 не установлен
erron while processing : libgio-2.0.so.0
blacklist: libgio-2.0.so.0
предупреждение: пакет libglib-2.0.so.0 не установлен
erron while processing : libglib-2.0.so.0
blacklist: libglib-2.0.so.0
предупреждение: пакет libgmodule-2.0.so.0 не установлен
erron while processing : libgmodule-2.0.so.0
blacklist: libgmodule-2.0.so.0
предупреждение: пакет libgobject-2.0.so.0 не установлен
erron while processing : libgobject-2.0.so.0
blacklist: libgobject-2.0.so.0
предупреждение: пакет libgthread-2.0.so.0 не установлен
erron while processing : libgthread-2.0.so.0
blacklist: libgthread-2.0.so.0
предупреждение: пакет libgtk-x11-2.0.so.0 не установлен
erron while processing : libgtk-x11-2.0.so.0
blacklist: libgtk-x11-2.0.so.0
предупреждение: пакет libpango-1.0.so.0 не установлен
erron while processing : libpango-1.0.so.0
blacklist: libpango-1.0.so.0
предупреждение: пакет libpangocairo-1.0.so.0 не установлен
erron while processing : libpangocairo-1.0.so.0
blacklist: libpangocairo-1.0.so.0
предупреждение: пакет libpython2.6.so.1.0 не установлен
erron while processing : libpython2.6.so.1.0
blacklist: libpython2.6.so.1.0
предупреждение: пакет libxml2.so.2 не установлен
erron while processing : libxml2.so.2
blacklist: libxml2.so.2
предупреждение: пакет liblzma.so.5 не установлен
erron while processing : liblzma.so.5
blacklist: liblzma.so.5
предупреждение: пакет libz.so.1 не установлен
erron while processing : libz.so.1
blacklist: libz.so.1
Всего найдено пакетов для удаления: 1
medit