Pip installiert das Paket zweimal

Leider kann ich es nicht reproduzieren, aber wir haben es mehrmals gesehen:

Pip installiert ein Paket zweimal.

  • Importieren Sie zwei Pakete mit demselben Namen
  • Wie kann ich Pip mit Pypy aus Launchpad installieren?
  • Kann kein Paket mit Pip [duplicate] installieren
  • Wann / wo sollte ich die minimale Python-Version überprüfen?
  • PIP Install Numpy wirft einen Fehler "ascii codec kann nicht decte byte 0xe2"
  • Wie man ein Python-Paket mit nur jinja Vorlagen zu machen
  • Wenn du das erste deinstallierst, wird das zweite sichtbar und kann auch deinstalliert werden.

    Meine Frage: Wie kann ich mit Python überprüfen, ob ein Paket zweimal installiert ist?

    Hintergrund: Ich möchte einen Test schreiben, der das überprüft (devOp)

    Aktualisieren

    • Pakete werden in einem virtualenv installiert.
    • Die beiden Pakete haben unterschiedliche Versionen.
    • Dies ist kein Duplikat von Lösungen, die dies von Hand lösen. Ich suche eine Lösung, um dies mit Python-Code zu erkennen. Wie dies zu lösen ist nicht Teil, wenn meine Frage.

    Update 2

    Der Befehl pip freeze gibt das Paket nur einmal aus:

     pip freeze | grep -i south South==0.8.1 

    Aber im virtuellen env existiert es zweimal:

     find lib -name top_level.txt |xargs cat | grep -i south south south ls lib/python2.7/site-packages/| grep -i south south South-0.8.1-py2.7.egg South-0.8.4-py2.7.egg-info 

    3 Solutions collect form web for “Pip installiert das Paket zweimal”

    Das sollte funktionieren:

     def count_installs(pkg_name): import imp, sys n = 0 for location in sys.path: try: imp.find_module(pkg_name, [location]) except ImportError: pass else: n += 1 return n 

    z.B

     >>> count_installs("numpy") 2 >>> count_installs("numpyd") 0 >>> count_installs("sympy") 1 

    Ich benutze diese Methode, um zu überprüfen, ob ein Paket zweimal installiert ist:

     def test_pip_python_packages_installed_twice(self): # https://stackoverflow.com/a/23941861/633961 pkg_name_to_locations=defaultdict(set) for dist in pkg_resources.working_set: for pkg_name in dist._get_metadata('top_level.txt'): for location in sys.path: try: importutils.does_module_exist_at_given_path(pkg_name, [location]) except ImportError: continue if location.startswith('/usr'): # ignore packages from "root" level. continue pkg_name_to_locations[pkg_name].add(location) errors=dict() for pkg_name, locations in sorted(pkg_name_to_locations.items()): if pkg_name in ['_markerlib', 'pkg_resources', 'site', 'easy_install', 'setuptools', 'pip']: continue if len(locations)==1: continue errors[pkg_name]=locations self.assertFalse(errors, 'Some modules are installed twice:\n%s' % '\n'.join(['%s: %s' % (key, value) for key, value in sorted(errors.items())])) 

    Importutils

     def does_module_exist_at_given_path(module_name, path): ''' imp.find_module() does not find zipped eggs. Needed for check: check if a package is installed twice. ''' for path_item in path: result=None try: result=imp.find_module(module_name, [path_item]) except ImportError: pass if result: return bool(result) if not os.path.isfile(path_item): continue # could be a zipped egg module=zipimport.zipimporter(path_item).find_module(module_name) if module: return bool(module) raise ImportError(module_name) 

    Verwandte: imp.find_module (), die gezippte Eier unterstützt

    South-0.8.1-py2.7.egg ist ein Zip-Archiv mit Süd- Quellcode, South-0.8.4-py2.7.egg-info ist ein Verzeichnis mit Metadaten-Dateien für South- Bibliothek.

    .egg-info (für Bibliotheken aus .tar.gz ) oder .dist-info (für libs installiert von Rädern .whl ) sind für jede Bibliothek vorhanden, die von pip installiert ist.

    .egg Archiv wird erstellt, wenn die Bibliothek als zip_safe in Metadaten markiert ist ( setup(zip_safe=True) in setup.py ). Ansonsten macht Pip ein Verzeichnis mit extrahierten Python-Quelldateien.

    Sehr alte Versionen von setuptools waren in der Lage, mehrere Versionen der gleichen Bibliothek zu installieren und eine davon als aktiv zu markieren, aber erwähnte Funktionalität wurde vor Jahren fallen gelassen, wenn ich mich richtig erinnere.

    Python ist die beste Programmiersprache der Welt.