Habt ihr schon den TopologicalSorter ausprobiert?
Mit Graphen hab ich eigentlich nicht viel am Hut, habe dann aber ein Beispiel gesucht, wofür z.B. der TopologicalSorter nutzbar ist.
Ich hatte dann die Idee, dass man damit z.B. Abhängigkeiten auflösen kann, was ja apt-get und die anderen Paketmanager auch machen.
Code: Alles auswählen
import sys
from collections import defaultdict
from itertools import chain
from pprint import pprint
from subprocess import DEVNULL, CalledProcessError, check_output
from graphlib import TopologicalSorter
def get_deps(package):
packages = []
cmd = ("apt-cache", "depends", package)
stdout = check_output(cmd, encoding="utf8", stderr=DEVNULL)
try:
for line in stdout.splitlines():
if "Depends:" in line:
_, p = line.split(":", maxsplit=1)
if "<" in p:
continue
packages.append(p.strip())
except CalledProcessError:
return []
else:
return packages
def main(p):
deps = defaultdict(set)
deps[p] = set(get_deps(p))
while missing := (set(chain.from_iterable(deps.values())) - deps.keys()):
for dep in missing:
if dep not in deps:
deps[dep] = set(get_deps(dep))
# remove cyclic redundancies
for name, p_deps in deps.items():
for sub in p_deps:
if sub in deps and name in deps[sub]:
print("Removing:", name)
deps[sub].remove(name)
return dict(deps)
if __name__ == "__main__":
if len(sys.argv) != 2:
print(sys.executable, sys.argv[0], "package-name")
sys.exit(1)
package = sys.argv[1].strip().lower()
deps = main(package)
tps = TopologicalSorter(deps)
tps.prepare()
while tps.is_active():
to_install = tps.get_ready()
print(to_install)
for install in to_install:
tps.done(install)
andre@DESKTOP-F29NT09:/mnt/c/Users/Admin$ python dependencies2.py python3
Removing: libc6
Removing: libc6
('mime-support', 'libcrypt1', 'gcc-10-base')
('libgcc-s1',)
('libc6',)
('libdb5.3', 'libbz2-1.0', 'liblzma5', 'libexpat1', 'libsqlite3-0', 'libzstd1', 'libtinfo6', 'libffi7', 'libmpdec2', 'libuuid1', 'zlib1g', 'libacl1', 'libpcre2-8-0')
('libncursesw6', 'libselinux1')
('tar',)
('dpkg',)
('install-info', 'perl-base')
('readline-common', 'debconf')
('libreadline8', 'libssl1.1')
('libpython3.8-minimal',)
('python3.8-minimal', 'libpython3.8-stdlib')
('python3-minimal', 'python3.8', 'libpython3-stdlib')
('python3',)
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server