it-swarm.com.de

Defekte Referenzen in Virtualenvs

Ich habe vor kurzem eine Reihe von Punktdateien auf meinem Mac installiert, zusammen mit einigen anderen Anwendungen (ich habe statt iTerm zu Terminals und zu Sublime als Standardtexteditor gewechselt). Seitdem funktionieren alle meine virtuellen Umgebungen nicht mehr, obwohl ihre Ordner in .virtualenvs liegen sind immer noch da und sie geben den folgenden Fehler, wenn ich versuche, irgendetwas darin 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 entfernt, die mit dotfiles in Verbindung stehen, und habe mein .bash_profile auf das zurückgesetzt, was es zuvor war, aber das Problem bleibt bestehen. Gibt es eine Möglichkeit, das Problem auf einfache Weise zu diagnostizieren oder zu lösen (beispielsweise müssen nicht alle virtuellen Server erneut erstellt werden)?

134
oxtay

Ich habe die Lösung für das Problem hier gefunden, daher geht der Autor für alles Gute.

Das Wichtigste dabei ist, dass beim Erstellen einer Virtualenv viele symbolische Links zu dem in 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 brew cleanup ausführen, zeigen 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 zeigen:

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 Virtualenv 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 prüfen, welche Links zuerst gelöscht werden, bevor sie gelöscht werden:

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

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

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

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

brew install findutils

Beachten Sie, dass GNU mit Homebrew installierten Programmen standardmäßig der Buchstabe g vorangestellt wird. Damit vermeiden Sie das Spiegeln der mit OS X gelieferten find-Binärdatei.

235
Ryan Kaskel

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

gehen 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

Um Ihr Spiel neu aufzubauen, führen Sie Folgendes aus:

virtualenv .
workon name_of_broken_venv
pip freeze

Sie sollten jetzt wieder eine Liste Ihrer installierten Pakete sehen.

22
Chris Wedgwood

Dies trat auf, als ich von Snow Leopard auf Mac OS X Mavericks aktualisiert habe. Ich musste das brew auch vorher neu installieren. Hoffentlich haben Sie den Freeze-Befehl für Ihr Projekt mit Pip ausgeführt.

Um das Problem zu beheben, 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 den 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 zuvor war.

10
Robert Brisita

Es scheint der richtige Weg, um dieses Problem zu lösen, ist die Ausführung

 pip install --upgrade virtualenv

nachdem Sie Python mit Homebrew aktualisiert haben. 

Dies sollte ein allgemeines Verfahren für jede Formel sein, die etwas wie Python installiert, das über ein eigenes Paketverwaltungssystem verfügt. Wenn Sie brew install python installieren, installieren Sie python und pip und easy_install und virtualenv und so weiter. Wenn sich diese Tools selbst aktualisieren können, versuchen Sie dies am besten, bevor Sie Homebrew als Ursache für Probleme betrachten. 

4
Nate

Wenn dies durch einen brew upgrade verursacht wurde, der sein Python aktualisiert hat, und Sie ein Upgrade auf die vorherige Version durchführen können, versuchen Sie brew switch python [previous version], zB brew switch python 3.6.5. Von hier.

4
ryan

Wenn Sie Python3 kaputt gemacht haben, probieren Sie einfach brew upgrade python3, der es für mich behoben hat.

2
jmoz

Die Antwortversion einer Update-Version @Chris Wedgwood für das Beibehalten von site-packages (das Installieren von Paketen)

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/
2
WeizhongTu

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

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

virtualenvwrapper Anweisungen

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

Für jede virtuelle Umgebung müssen Sie die Sym-Links neu zuordnen, um auf den richtigen Python-Pfad (im Braukeller) zu zeigen. So machen Sie es mit virtualenvwrapper . Hier aktualisiere ich eine virtuelle Env mit dem Namen "my-example-env".

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

Alles erledigt.

1
arcseldon

Python verwenden 2.7.10.

Ein einzelner Befehl virtualenv path-to-env erledigt das. 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
Ayush Goel

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

Wir können das überprüfen und beheben

>> 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
1
liuyihe

Ich habe das kürzlich gesehen. Keine der oben genannten Lösungen funktionierte für mich. Anscheinend war es nicht wirklich Pythons Problem. Als ich rannte 

aws s3 ls 

Ich habe folgenden Fehler erhalten: 

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

Dies bedeutet, dass die ausführbare Bibliothek aws darauf hinweist, dass entweder nicht vorhanden oder beschädigt ist. Daher habe ich aws-cli deinstalliert und folgende Anweisungen von diesem Link installiert, und es hat funktioniert !!

1
thekosmix

Was es für mich reparierte, war nur die Deinstallation von python3 und pipenv und die anschließende Neuinstallation.

brew uninstall pipenv
brew uninstall python3
brew install python3 
brew install pipenv
0
Lord Nikon

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

Sudo pip install tox

auch wenn tox schon installiert war. Die Ausgabe wurde beendet 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
Marco

Die akzeptierte Antwort funktioniert nicht für mich: Die Datei $WORKON_HOME/*/bin/python2.7 ist 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 ist leider, die virtuellen Umgebungen all vollständig zu entfernen und von Grund auf neu zu erstellen.

Für die 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
0
sds

Ich hatte eine kaputte virtuelle Umgebung aufgrund einer Neuinstallation von Python durch Homebrew (dadurch kaputte Symlinks) und auch ein paar "Sudo-Pip-Installationen", die ich zuvor durchgeführt hatte. Die Tipps von Weizhong waren sehr hilfreich bei der Behebung der Probleme, ohne dass Pakete neu installiert werden mussten. Ich musste auch das folgende für das Mischberechtigungsproblem tun.

Sudo chown -R mein_Benutzername lib/python2.7/site-packages

0
P. Gabbur

Das einfache Upgrade von python3 hat für mich funktioniert:

brew upgrade python3
0
Flavio Wuensche