Defekte Referenzen in Virtualenvs


238

Ich habe kürzlich eine Reihe von Punktedateien auf meinem Mac zusammen mit einigen anderen Anwendungen installiert (ich habe zu iTerm anstelle von Terminal und Sublime als Standardtexteditor gewechselt), aber seitdem funktionieren alle meine virtuellen Umgebungen nicht mehr, obwohl sich ihre Ordner in .virtualenvs befinden sind immer noch da und geben den folgenden Fehler aus, wenn ich versuche, etwas in ihnen auszuführen:

dyld: Library not loaded: @executable_path/../.Python
  Referenced from: /Users/[user]/.virtualenvs/modclass/bin/python
  Reason: image not found
Trace/BPT trap: 5

Ich habe alle Dateien im Zusammenhang mit Punktedateien entfernt und mein .bash_profile auf den vorherigen Stand zurückgesetzt, aber das Problem besteht weiterhin. Gibt es eine Möglichkeit, das Problem zu diagnostizieren oder auf einfache Weise zu lösen (z. B. müssen nicht alle virtuellen Umgebungen erneut erstellt werden)?



Vielen Dank für den Kommentar, @unubtu. Das ist sicherlich hilfreich. Ich kann aber auch keine neuen virtuellen Envs erstellen. Mein rmvirtualenvfunktioniert immer noch, aber wenn mkvirtualenvich versuche auszuführen , erhalte ich den folgenden Fehler: -bash: /usr/local/bin/virtualenv: /usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/Resour: bad interpreter: No such file or directory Es scheint also ein Problem mit meinen Python-Pfaden zu sein, aber ich kann nicht sehen, wo das Problem liegt, da ich Python ausführen kann und es in Ordnung zu sein scheint.
Oxtay

1
[Update] Ich habe das Problem möglicherweise gefunden, bin mir aber nicht sicher und weiß nicht, wie ich es beheben soll. Es scheint, dass alle virtualenvBefehle jetzt theoretisch funktionieren, aber da es ein Problem mit Python gibt, tun sie nichts. Das eigentliche Problem liegt also bei Brew's Python. Und ich habe den Verdacht, dass der Grund in einer Namensänderung in Python-Verzeichnissen liegt. Aus irgendeinem Grund suchen alle diese Befehle nach Python im Ordner, /usr/local/Cellar/python/2.7.6aber der Name des Ordners lautet tatsächlich /usr/local/Cellar/python/2.7.6_1.
Oxtay

Da ich ein Anfänger bin, weiß ich nicht, wie riskant es ist, den Namen manuell von 2.7.6_1 in 2.7.6 zu ändern und zu sehen, was passiert.
Oxtay

Sie sollten in der Lage sein , umbenennen 2.7.6_1zu 2.7.6. Im schlimmsten Fall können Sie es wieder umbenennen.
Unutbu

Antworten:


369

Ich habe hier die Lösung für das Problem gefunden , daher geht der gesamte Kredit an den Autor.

Das Wesentliche ist, dass beim Erstellen einer virtuellen Umgebung viele Symlinks zum von Homebrew installierten Python erstellt werden.

Hier ist ein Beispiel:

$ ls -la ~/.virtualenvs/my-virtual-env
...
lrwxr-xr-x  1 ryan staff   78 Jun 25 13:21 .Python -> /usr/local/Cellar/python/2.7.7/Frameworks/Python.framework/Versions/2.7/Python
...

Wenn Sie Python mit Homebrew aktualisieren und dann ausführen brew cleanup , verweisen die Symlinks in der virtuellen Umgebung auf Pfade, die nicht mehr vorhanden sind (weil Homebrew sie gelöscht hat).

Die Symlinks müssen auf das neu installierte Python verweisen:

lrwxr-xr-x  1 ryan staff   78 Jun 25 13:21 .Python -> /usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/Python

Die Lösung besteht darin, die Symlinks in der virtuellen Umgebung zu entfernen und sie dann neu zu erstellen:

find ~/.virtualenvs/my-virtual-env/ -type l -delete
virtualenv ~/.virtualenvs/my-virtual-env

Es ist wahrscheinlich am besten zu überprüfen, welche Links zuerst gelöscht werden, bevor Sie sie löschen:

find ~/.virtualenvs/my-virtual-env/ -type l

Meiner Meinung nach ist es sogar noch besser, nur defekte Symlinks zu löschen. Sie können dies mit GNU tun find:

gfind ~/.virtualenvs/my-virtual-env/ -type l -xtype l -delete

Sie können GNU findmit Homebrew installieren, wenn Sie es noch nicht haben:

brew install findutils

Beachten Sie, dass GNU-Programmen, die mit Homebrew installiert wurden, standardmäßig der Buchstabe vorangestellt wird g. Dies soll verhindern, dass die findmit OS X gelieferte Binärdatei beschattet wird.


4
+1 gfindwar perfekt, da ich viele ungebrochene Symlinks (z. B. Nodeenv) hatte, die ich nicht löschen wollte
2Toad

3
Eine andere Möglichkeit, defekte Symlinks zu entfernen, ist die Verwendung der Standardsuche:find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm
vdboor

Ich habe mein gesamtes virtuelles Verzeichnis gelöscht. Jetzt kann ich keine Symlinks entfernen. Keine der auf dieser Seite genannten Lösungen funktioniert für mich auf dem Mac. Ich erhalte immer noch den gleichen Fehler "Bild nicht gefunden.
Abbruchfalle

Diese Schritte haben bei mir nicht ganz funktioniert:pip3 freeze dyld: lazy symbol binding failed: Symbol not found: __Py_UnixMain
deed02392

1
Nur um hinzuzufügen, wenn die Umgebung mit Python 2 war, führen Sie es mit Argument: aus virtualenv ~/.virtualenvs/foo -p python2, sonst wird Python 3 verwendet.
Bohumir Zamecnik

41

Nachdem ich ein paar Dinge ausprobiert hatte, funktionierte dies für mich:

Wechseln Sie in Ihr virtualenv-Verzeichnis (führen Sie Workon jedoch nicht aus):

cd ~/.virtualenv/name_of_broken_venv

Löschen Sie nun diese Dateien:

rm -rf .Python bin/python* lib/python2.7/* include/python2.7

Führen Sie dann Folgendes aus, um Ihr Venv wieder aufzubauen:

virtualenv .
workon name_of_broken_venv
pip freeze

Sie sollten nun wieder eine Liste Ihrer installierten Pakete sehen.


FWIW, ich habe diesen Ansatz gerade versucht, nachdem ich auf El Capitan aktualisiert und Homebrew neu installiert hatte, und meine Paketliste wurde nicht beibehalten.
Ryan

1
mit pipenv können Sie entfernen, indem Sie tun pipenv --rmund neu erstellen pipenv shell,pipenv install
Harry Moreno

14

Dies geschah, als ich von Snow Leopard auf Mac OS X Mavericks aktualisiert habe. Ich musste das Gebräu auch vorher neu installieren. Hoffentlich haben Sie den Befehl freeze für Ihr Projekt mit pip ausgeführt.

Zum Auflösen müssen Sie die Pfade aktualisieren, auf die die virtuelle Umgebung verweist.

  • Installieren Sie eine Version von Python mit Brew:

brew install python

  • Installieren Sie virtualenvwrapper erneut.

pip install --upgrade virtualenvwrapper

  • Die alte virtuelle Umgebung wurde entfernt:

rmvirtualenv old_project

  • Erstellen Sie eine neue virtuelle Umgebung:

mkvirtualenv new_project

  • Arbeiten Sie an einer neuen virtuellen Umgebung

workon new_project

  • Verwenden Sie pip, um die Anforderungen für das neue Projekt zu installieren.

pip install -r requirements.txt

Dies sollte das Projekt so lassen, wie es vorher war.


Dies ist eine Weile her und ich glaube, ich habe irgendwann etwas in diese Richtung getan, aber da ich damals noch nicht 'pip freeze> require.txt' ausgeführt hatte, war es nicht die effizienteste Lösung. Lektion gelernt.
Oxtay

13

Die @Chris WedgwoodAntwort einer Update-Version zum Speichern site-packages(Pakete bleiben installiert)

cd ~/.virtualenv/name_of_broken_venv


mv lib/python2.7/site-packages ./    
rm -rf .Python bin lib include
virtualenv .
rm -rf lib/python2.7/site-packages
mv ./site-packages lib/python2.7/

1
Das ist jenseits der Perfektion. Hilft bei der Migration der Python-Version unter Beibehaltung aller Pakete. Wenn Sie dies befolgen, führen Sie die Anweisungen von @Chris Wedgewood nicht aus.
Harish Prasanna

10

Es scheint, dass der richtige Weg, um dieses Problem zu beheben, darin besteht, es auszuführen

 pip install --upgrade virtualenv

nachdem Sie Python mit Homebrew aktualisiert haben.

Dies sollte eine allgemeine Prozedur für jede Formel sein, die etwas wie Python installiert, das über ein eigenes Paketverwaltungssystem verfügt. Wenn Sie installieren brew install python, installieren Sie pythonund pipund easy_installund virtualenvund so weiter. Wenn diese Tools selbst aktualisiert werden können, versuchen Sie dies am besten, bevor Sie sich an Homebrew als Ursache für Probleme wenden.


Dies funktionierte für ein Problem mit Setuptools, insbesondere: Warnung: SVN-Speicherort für Setuptools kann nicht gefunden werden == 0.6c12dev-r88846
Robert Brisita

1
Ich habe diese Lösung angewendet und anschließend ausgeführt: virtualenv . in meiner kaputten virtuellen Umgebung. Die aktualisierte Version von hat virtualenvdann die notwendigen Abhängigkeiten neu erstellt und ich konnte loslegen. Dieser Prozess war selbstverwalteter und robuster als die für mich akzeptierte Antwort.
Christang

Im Jahr 2020 ist dies immer noch die Antwort.
Scubabuddha

7

Wenn dies durch ein brew upgradeUpgrade des Python verursacht wurde und Sie ein Downgrade auf die vorherige Version durchführen können, versuchen Sie es brew switch python [previous version]z brew switch python 3.6.5. Von hier.


4

Anweisungen für virtualenvwrapper

Wie in der akzeptierten Antwort angegeben, ist die Hauptursache wahrscheinlich ein Homebrew-Update, das bedeutet, dass Ihre virtuellen Symlinks auf fehlerhafte Python-Pfade verweisen - siehe Details hier .

Für jede virtuelle Umgebung müssen Sie die Symlinks neu zuweisen, um auf den richtigen Python-Pfad (im Brühkeller) zu zeigen. Hier erfahren Sie, wie Sie dies mit virtualenvwrapper tun . Hier aktualisiere ich eine virtuelle Umgebung namens "my-example-env".

cd ~/PYTHON_ENVS
find ./my-example-env -type l -delete
mkvirtualenv my-example-env

Alles erledigt.


4

Jeder, der pipenv verwendet (und Sie sollten!), Kann einfach diese beiden Befehle verwenden - ohne dass venv aktiviert ist:

rm -rf `pipenv --venv` # remove the broken venv
pipenv install --dev   # reinstall the venv from pipfile 

1
Sie können auch pipenv --rmim Ordner Ihrer Umgebung verwenden und dannpipenv install --dev
Handfeger

2

Wenn Sie Python3 kaputt gemacht haben, versuchen Sie es einfach und beheben Sie brew upgrade python3es für mich.


2

Ich habe mich kürzlich damit konfrontiert. Keine der oben genannten Lösungen hat bei mir funktioniert. Es scheint nicht wirklich Pythons Problem zu sein. Beim Ausführen

aws s3 ls

wurde der folgende Fehler angezeigt:

dyld: Library not loaded: @executable_path/../.Python

Dies bedeutet, dass die awsausführbare Bibliothek, auf die verwiesen wird, entweder nicht vorhanden oder beschädigt ist. Daher habe ich die aws-cliAnweisungen über diesen Link deinstalliert und neu installiert und es hat funktioniert !!


2

Das Problem für mich (einen MacOS-Benutzer) ist, dass brewdie Python- und Virtualenvs-Links auf die alte Version aktualisiert wurden, die gelöscht wurde.

Wir können es überprüfen und beheben, indem wir

>> ls -al ~/.virtualenvs/<your-virtual-env>/.Python
.Python -> /usr/local/Cellar/python/<old-version>/Frameworks/Python.framework/Versions/3.7/Python
>> rm ~/.virtualenvs/<your-virtual-env>/.Python
>> ln -s  /usr/local/Cellar/python/<new-version>/Frameworks/Python.framework/Versions/3.7/Python ~/.virtualenvs/<your-virtual-env>/.Python

Dies funktionierte auch, um defekte Links nach der Installation von Python 3.7 auf einem System mit Python3.6
lukik

2

Ich hatte ein ähnliches Problem und habe es gelöst, indem ich einfach die virtuelle Umgebung mit neu erstellt habe virtualenv .


Willkommen bei SO. Obwohl wir uns für Ihre Antwort bedanken, wäre es besser, wenn sie zusätzlich zu den anderen Antworten einen zusätzlichen Wert liefern würde. In diesem Fall bietet Ihre Antwort keinen zusätzlichen Wert, da ein anderer Benutzer diese Lösung bereits veröffentlicht hat. Wenn eine vorherige Antwort für Sie hilfreich war, sollten Sie sie abstimmen, sobald Sie genug Ruf haben
David Buck

1

Verwenden von Python 2.7.10.

Ein einziger Befehl virtualenv path-to-envmacht es. Dokumentation

$ virtualenv path-to-env
Overwriting path-to-env/lib/python2.7/orig-prefix.txt with new content
New python executable in path-to-env/bin/python2.7
Also creating executable in path-to-env/bin/python
Installing setuptools, pip, wheel...done.

1

Ich hatte eine kaputte virtuelle Umgebung aufgrund einer Homebrew-Neuinstallation von Python (dadurch defekte Symlinks) und auch ein paar "sudo pip install" s, die ich zuvor gemacht hatte. Die Tipps von Weizhong waren sehr hilfreich bei der Behebung der Probleme, ohne dass Pakete neu installiert werden mussten. Ich musste auch Folgendes für das Problem mit gemischten Berechtigungen tun.

sudo chown -R my_username lib / python2.7 / site-packages


Wenn Sie die Antworten eines anderen Benutzers ergänzen, sollten Sie ihm einen Kommentar hinterlassen, damit er sie bearbeiten kann! Schöner Beitrag.
Francisco Peters

Er hat nicht genug Reputationspunkte, um eine Antwort zu kommentieren.
Tyler Smith

1

Virtualenvs sind kaputt. Manchmal ist es einfach, venv-Ordner zu löschen und virutalenvs neu zu erstellen.


1

Wenn Sie pipenv verwenden, wird pipenv --rmdas Problem durch einfaches Ausführen gelöst.


1

Ich hatte das gleiche Problem, nachdem ich Brew auf meinem OSX Catalina aktualisiert hatte.

Nachdem ich ein paar Sachen ausprobiert habe, finde ich, dass das Folgende die beste und einfachste Lösung ist.

Löschen Sie zunächst die virtuelle Umgebung. (Optional)

find myvirtualenv -type l -delete

Erstellen Sie dann eine neue virtuelle Umgebung

virtualenv myvirtualenv

Referenz: https://www.jeremycade.com/python/osx/homebrew/2015/03/02/fixing-virtualenv-after-a-python-upgrade/


0

Die akzeptierte Antwort funktioniert bei mir nicht: Die Datei $WORKON_HOME/*/bin/python2.7ist kein Symlink mehr, sondern eine vollwertige ausführbare Datei:

$ file $WORKON_HOME/*/bin/python2.7
/Users/sds/.virtualenvs/.../bin/python2.7: Mach-O 64-bit executable x86_64
...

Die Lösung besteht leider darin, alle virtuellen Umgebungen vollständig zu entfernen und von Grund auf neu zu erstellen .

Als Referenz:

deactivate
pip install --user virtualenv virtualenvwrapper
pip install --user --upgrade virtualenv virtualenvwrapper
for ve in $(lsvirtualenv -b); do
  # assume that each VE is associated with a project
  # and the project has the requirements.txt file
  project=$(cat $WORKON_HOME/$ve/.project)
  rmvirtualenv $ve
  mkvirtualenv -a $project -r requirements.txt $ve
done

Ich denke, das liegt daran, dass diese Lösung nicht veraltet ist - ich habe sie gerade ausprobiert und mein Problem behoben. Ich denke auch, wenn Sie keine Symlinks haben, wird der hier beschriebene Fehler nicht angezeigt, sodass dieser Kommentar keine Lösung, sondern eine Ablenkung darstellt. Nur weil Sie eine neuere Version haben, heißt das nicht, dass dies jeder tut. Das ist meine Vermutung, warum die Abstimmung :)
RafazZ

@ RafazZ: Ich hoffe es ist jetzt besser. Ich frage mich jedoch, warum es immer noch ein Symlink für Sie ist. Und ja, ich erhalte diesen Fehler, weil die virtuelle Python mit den Standard-Python-Bibliotheken verknüpft ist.
SDS

Ich denke, das Standardverhalten besteht immer noch darin, Symlinks zu erstellen, und Sie benötigen ein --always-copyArgument, um es zu überschreiben. Zumindest das, was ich aus dem Benutzerhandbuch
RafazZ

@ RafazZ: Ich habe nie verwendet --always-copyund ich habe reguläre Dateien :-(
SDS


0

Ich habe die besten Methoden ausprobiert, aber sie haben für mich nicht funktioniert, da sie versucht haben, Tox zum Funktionieren zu bringen. Was schließlich funktionierte, war:

sudo pip install tox

auch wenn tox schon installiert war. Die Ausgabe endete mit:

Successfully built filelock
Installing collected packages: py, pluggy, toml, filelock, tox
Successfully installed filelock-3.0.10 pluggy-0.11.0 py-1.8.0 toml-0.10.0 tox-3.9.0

0

Was es für mich behoben hat, war nur die Deinstallation von Python3 und Pipenv und die Neuinstallation.

brew uninstall pipenv
brew uninstall python3
brew install python3 
brew install pipenv

0

Alle Antworten sind hier großartig. Ich habe einige der oben genannten Lösungen von Ryan, Chris ausprobiert und konnte das Problem nicht lösen. Deshalb musste ich schnell und schmutzig vorgehen.

  1. rm -rf <project dir>(oder mv <project dir> <backup projct dir>wenn Sie ein Backup behalten möchten)
  2. git clone <project git url>
  3. Mach weiter!

Nichts Neues hier, aber es macht das Leben leichter!


0

Ich bin mir sicher, dass ich zu spät zur Party komme, aber ich möchte sagen, dass die Lösung dieses Problems viel einfacher ist als hier diskutiert.

Sie können die virtuelle Umgebung einfach neu generieren, ohne etwas löschen / bearbeiten zu müssen. Angenommen, Ihre kaputte Umgebung wird aufgerufen env_to_fix, können Sie nur Folgendes tun:

mkvirtualenv env_to_fix

Dadurch werden die Links neu generiert und die Umgebung repariert, ohne dass der aktuelle Status irgendwo gespeichert und wiederhergestellt werden muss.


0

Ich bin auf dasselbe Problem gestoßen, als ich auf meinem Mac auf meine Python-Laufzeit von 2 bis 3 zeigte und den Alias ​​Python auf den Python 3-Pfad zeigte. Anschließend erstelle ich eine neue virtuelle Umgebung und installiere die für mein Projekt erforderlichen Pakete erneut. Für meinen Anwendungsfall hatte ich ein Python-Programm, das auf Google Sheet schrieb. Bereinigen Sie einige Pakete, die sich von der Python 2-Implementierung unterscheiden, und wa la, die Dinge fingen wieder an zu funktionieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.