Pip installiert das Paket zweimal

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

Pip installiert ein Paket zweimal.

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 

  • Aktiviere ein virtualenv mit einem Python-Skript
  • Erstellen eines einfachen Pakets, das über Pip & virtualenv installiert werden kann
  • Wie man virtualenv in einem Bash-Skript aktivieren kann
  • MacVim verwendet falsche Python Virtualenv
  • ImportError: Kein Modul namens Tweepy
  • PIL sagt, es hat "Unterstützung verfügbar", aber immer noch IOError beim Speichern von Dateien
  • Installierte virtualenv und virtualenvwrapper: Python sagt kein Modul namens virtualenvwrapper
  • Wie installiere ich virtualenv auf einer Maschine ohne Root-Zugriff
  • 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.