web-dev-qa-db-fra.com

Références brisées dans Virtualenvs

J'ai récemment installé un tas de fichiers de points sur mon Mac avec d'autres applications (j'ai changé pour iTerm au lieu de Terminal et Sublime comme éditeur de texte par défaut), mais depuis lors, tous mes environnements virtuels ont cessé de fonctionner, même si leurs dossiers au sein de .virtualenvs sont toujours là et donnent l'erreur suivante chaque fois que j'essaie d'exécuter quoi que ce soit en eux:

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

J'ai supprimé tous les fichiers liés aux fichiers de points et ai restauré mon .bash_profile à son état antérieur, mais le problème persiste. Existe-t-il un moyen de diagnostiquer le problème ou de le résoudre facilement (par exemple, il n’est pas nécessaire de créer à nouveau tous les virtualenvs)?

134
oxtay

J'ai trouvé la solution au problème ici , donc tout le mérite revient à l'auteur.

En résumé, lorsque vous créez un fichier virtualenv, de nombreux liens symboliques sont créés vers le Python installé par Homebrew.

Voici un exemple:

$ 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
...

Lorsque vous mettez à niveau Python à l'aide de Homebrew, puis que vous exécutez brew cleanup, les liens symboliques dans virtualenv pointent vers des chemins qui n'existent plus (car Homebrew les a supprimés).

Les liens symboliques doivent pointer vers le Python nouvellement installé:

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

La solution consiste à supprimer les liens symboliques dans virtualenv, puis à les recréer:

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

Il est probablement préférable de vérifier quels liens seront supprimés avant de les supprimer:

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

À mon avis, il est même préférable de ne supprimer que les liens symboliques rompus. Vous pouvez le faire en utilisant GNU find:

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

Vous pouvez installer GNU find avec Homebrew si vous ne l'avez pas déjà:

brew install findutils

Notez que par défaut, les programmes GNU installés avec Homebrew ont tendance à être préfixés de la lettre g. Ceci permet d'éviter l'observation du binaire find fourni avec OS X.

235
Ryan Kaskel

Après avoir essayé plusieurs choses, cela a fonctionné pour moi:

accédez à votre répertoire virtualenv (mais n'exécutez pas workon):

cd ~/.virtualenv/name_of_broken_venv

Supprimez maintenant ces fichiers:

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

Alors pour reconstruire votre venv, exécutez:

virtualenv .
workon name_of_broken_venv
pip freeze

Vous devriez maintenant voir une liste de vos paquets installés à nouveau.

22
Chris Wedgwood

Cela s'est produit lorsque j'ai mis à jour Mac OS X Mavericks de Snow Leopard. Je devais aussi ré-installer le brassin. J'espère que vous avez exécuté la commande freeze pour votre projet avec pip.

Pour résoudre ce problème, vous devez mettre à jour les chemins sur lesquels pointe l'environnement virtuel.

  • Installez une version de python avec brew:

brew install python

  • Réinstallez virtualenvwrapper.

pip install --upgrade virtualenvwrapper

  • Suppression de l'ancien environnement virtuel:

rmvirtualenv old_project

  • Créez un nouvel environnement virtuel:

mkvirtualenv new_project

  • Travailler sur un nouvel environnement virtuel

workon new_project

  • Utilisez pip pour installer les exigences du nouveau projet.

pip install -r requirements.txt

Cela devrait laisser le projet tel qu'il était avant.

10
Robert Brisita

Il semble la bonne façon de résoudre ce problème est de courir

 pip install --upgrade virtualenv

après avoir mis à niveau python avec Homebrew. 

Cela devrait être une procédure générale pour toute formule qui installe quelque chose comme Python, qui a son propre système de gestion de paquets. Lorsque vous installez brew install python, vous installez python et pip et easy_install et virtualenv et ainsi de suite. Par conséquent, si ces outils peuvent être mis à jour automatiquement, il est préférable d'essayer de le faire avant de considérer Homebrew comme source de problèmes. 

4
Nate

Si cela est dû à un brew upgrade qui a mis à niveau son Python et que vous pouvez passer à la version précédente, essayez brew switch python [previous version], par exemple brew switch python 3.6.5. D'ici.

4
ryan

Si vous avez éliminé python3, essayez simplement brew upgrade python3 qui le corrige pour moi.

2
jmoz

Une réponse de la version mise à jour @Chris Wedgwood pour conserver site-packages (conserver les packages installés)

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

Quiconque utilise pipenv (et vous devriez!) Peut simplement utiliser ces deux commandes - sans que le venv ne soit activé:

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

instructions virtualenvwrapper

Comme indiqué dans la réponse acceptée, la cause principale est probablement une mise à jour homebrew qui signifie que vos liens symboliques virtualenv pointent vers des chemins python cassés - voir détails ici .

Pour chaque env virtuel, vous devez réaffecter les liens symboliques pour qu'ils pointent sur le chemin correct de python (dans la cave à café). Voici comment le faire avec virtualenvwrapper . Ici, je mets à jour un env virtuel appelé "my-example-env".

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

Terminé.

1
arcseldon

Utiliser Python 2.7.10.

Une seule commande virtualenv path-to-env le fait. Documentation

$ 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

Le problème pour moi (un utilisateur MacOS) est que brewa mis à jour les liens Python et virtualenvs vers l'ancienne version qui a été supprimée.

Nous pouvons vérifier et résoudre le problème en

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

J'ai récemment fait face à cela. Aucune des solutions ci-dessus n'a fonctionné pour moi. On dirait que ce n'était pas vraiment le problème de Python. Quand je courais 

aws s3 ls 

Je recevais l'erreur suivante: 

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

Cela signifie que l'exécutable de la bibliothèque aws est soit inexistant soit corrompu, j'ai donc désinstallé et réinstallé aws-cli en suivant les instructions de ce lien et tout a fonctionné !!

1
thekosmix

Ce qui a résolu le problème pour moi était de désinstaller python3 et pipenv, puis de les réinstaller.

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

J'ai essayé les meilleures méthodes, mais elles ne fonctionnaient pas, pour moi, qui essayaient de faire fonctionner tox. Ce qui a finalement fonctionné a été:

Sudo pip install tox

même si tox était déjà installé. La sortie s'est terminée par:

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

La réponse acceptée ne fonctionne pas pour moi: le fichier $WORKON_HOME/*/bin/python2.7 n'est plus un lien symbolique, c'est un exécutable à part entière:

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

La solution consiste, hélas, à supprimer complètement et à recréer à partir de zéro tous les environnements virtuels.

Pour la référence:

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

J'avais un env. Virtuel cassé en raison d'une réinstallation de python par Homebrew (ainsi que des liens symboliques brisés) et de quelques "installations Sudo pip" que j'avais effectuées précédemment. Les conseils de Weizhong ont été très utiles pour résoudre les problèmes sans avoir à réinstaller les paquets. Je devais également faire ce qui suit pour le problème des autorisations mixtes.

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

0
P. Gabbur

Simplement mettre à niveau python3 a fonctionné pour moi:

brew upgrade python3
0
Flavio Wuensche