Referências desfeitas no Virtualenvs

238

Recentemente, instalei um monte de arquivos dotfiles no meu Mac, juntamente com outros aplicativos (mudei para iTerm em vez de Terminal e Sublime como meu editor de texto padrão), mas desde então todos os meus ambientes virtuais pararam de funcionar, embora suas pastas contenham .virtualenvs ainda estão lá e eles dão o seguinte erro sempre que tento executar alguma coisa neles:

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

Eu removi todos os arquivos relacionados aos dotfiles e restaurei meu .bash_profile para o que era antes, mas o problema persiste. Existe alguma maneira de diagnosticar o problema ou resolvê-lo de uma maneira fácil (por exemplo, não é necessário criar todos os virtualenvs novamente)?

oxtay
fonte
Obrigado pelo comentário, @unubtu. Isso certamente é útil. Mas também não sou capaz de criar novos virtualenvs. Meu rmvirtualenvainda funciona, mas ao tentar executar mkvirtualenv, recebo o seguinte erro: -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 Então, parece um problema com meus caminhos python, mas não consigo ver onde está o problema, pois posso executar python e parece bom.
oxtay
1
[atualização] Talvez eu tenha encontrado o problema, mas não tenho certeza e não tenho certeza de como corrigi-lo. Parece que todos os virtualenvcomandos estão funcionando agora na teoria, mas como há um problema com o python, eles não fazem nada. Portanto, o verdadeiro problema é com o python do brew. E eu suspeito que o motivo seja devido a uma alteração de nome nos diretórios python. Por alguma razão, todos esses comandos estão procurando python na pasta, /usr/local/Cellar/python/2.7.6mas o nome da pasta é realmente /usr/local/Cellar/python/2.7.6_1.
oxtay
Como sou novato, não sei como é arriscado alterar manualmente o nome de 2.7.6_1 para 2.7.6 e ver o que acontece.
oxtay
Você poderá renomear 2.7.6_1para 2.7.6. Se o pior acontecer, você poderá renomeá-lo novamente.
Unutbu 23/04/2014

Respostas:

369

Encontrei a solução para o problema aqui , então todo o crédito é do autor.

O essencial é que, quando você cria um virtualenv, muitos links simbólicos são criados para o Python instalado no Homebrew.

Aqui está um exemplo:

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

Quando você atualiza o Python usando o Homebrew e executa brew cleanup , os links simbólicos no virtualenv apontam para caminhos que não existem mais (porque o Homebrew os excluiu).

Os links simbólicos precisam apontar para o Python recém-instalado:

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

A solução é remover os links simbólicos no virtualenv e, em seguida, recriá-los:

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

Provavelmente, é melhor verificar quais links serão excluídos antes de excluí-los:

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

Na minha opinião, é ainda melhor excluir apenas links simbólicos quebrados. Você pode fazer isso usando o GNU find:

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

Você pode instalar o GNU findcom Homebrew se ainda não o tiver:

brew install findutils

Observe que, por padrão, os programas GNU instalados com o Homebrew tendem a ser prefixados com a letra g. Isso é para evitar sombrear o findbinário fornecido com o OS X.

Ryan Kaskel
fonte
4
+1 gfindfoi perfeito, desde que eu tinha um monte de links simbólicos ininterrupta (por exemplo, nodeenv) que não deseja excluir
2Toad
3
Outra maneira de remover links simbólicos quebrados está usando a descoberta padrão:find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm
vdboor
Eu apaguei todo o meu diretório virtualenv. agora não consigo remover links simbólicos. Nenhuma das soluções mencionadas nesta página funciona para mim no mac. ainda recebo o mesmo erro "imagem não encontrada. Interromper armadilha: 6"
Aseem
Estas etapas não funcionaram muito bem para mim:pip3 freeze dyld: lazy symbol binding failed: Symbol not found: __Py_UnixMain
deed02392 01/02/19
1
Só para acrescentar, se o env estava com Python 2, executá-lo com o argumento: virtualenv ~/.virtualenvs/foo -p python2, caso contrário ele irá usar Python 3.
Bohumír Zamecnik
41

Depois de tentar algumas coisas, isso funcionou para mim:

vá para o diretório virtualenv (mas não execute o workon):

cd ~/.virtualenv/name_of_broken_venv

Agora exclua esses arquivos:

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

Em seguida, para reconstruir seu venv, execute:

virtualenv .
workon name_of_broken_venv
pip freeze

Agora você deve ver uma lista dos seus pacotes instalados novamente.

Chris Wedgwood
fonte
FWIW, eu apenas tentei essa abordagem depois de atualizar para o El Capitan e reinstalar o homebrew, e minha lista de pacotes não foi preservada.
21716 Ryan
1
com o pipenv você pode remover fazendo pipenv --rme recriar pipenv shell, #pipenv install
Harry Moreno
14

Isso ocorreu quando eu atualizei para o Mac OS X Mavericks do Snow Leopard. Eu tive que reinstalar a preparação de antemão também. Espero que você tenha executado o comando freeze para seu projeto com o pip.

Para resolver, você precisa atualizar os caminhos para os quais o ambiente virtual aponta.

  • Instale uma versão do python com o brew:

brew install python

  • Reinstale o virtualenvwrapper.

pip install --upgrade virtualenvwrapper

  • Removido o antigo ambiente virtual:

rmvirtualenv old_project

  • Crie um novo ambiente virtual:

mkvirtualenv new_project

  • Trabalhar no novo ambiente virtual

workon new_project

  • Use pip para instalar os requisitos para o novo projeto.

pip install -r requirements.txt

Isso deve deixar o projeto como estava antes.

Robert Brisita
fonte
Isso foi há um tempo atrás e acredito que eventualmente fiz algo nesse sentido, mas como não havia executado 'pip freeze> requirements.txt' naquela época, não era a solução mais eficiente. Lição aprendida.
oxtay
13

A @Chris Wedgwoodresposta de uma versão de atualização para manter site-packages(manter os pacotes instalados)

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/
WeizhongTu
fonte
1
Isso está além da perfeição. Ajuda a migrar a versão python, mantendo todos os pacotes. Se você estiver seguindo isso, não execute as instruções de @Chris Wedgewood.
Harish Prasanna
10

Parece que a maneira correta de resolver esse problema é executar

 pip install --upgrade virtualenv

depois de atualizar o python com o Homebrew.

Esse deve ser um procedimento geral para qualquer fórmula que instale algo como python, que possui seu próprio sistema de gerenciamento de pacotes. Quando você instala brew install python, você instala pythone pipe easy_installe virtualenve assim por diante. Portanto, se essas ferramentas puderem ser atualizadas automaticamente, é melhor tentar fazer isso antes de considerar o Homebrew como a fonte dos problemas.

Nate
fonte
Isso funcionou para um problema com setuptools, especificamente: Aviso: não é possível encontrar a localização svn para setuptools == 0.6c12dev-r88846
Robert Brisita
1
Eu apliquei esta solução, seguida pela execução: virtualenv . no meu ambiente virtual quebrado. A versão atualizada virtualenventão recriou as dependências necessárias e eu estava pronto. Esse processo foi mais autogerenciado e robusto do que a resposta aceita para mim.
precisa
Em 2020, essa ainda é a resposta.
scubabuddha 23/04
7

Se isso foi causado por um brew upgradeque atualizou seu Python, e você está bem com o downgrade para a versão anterior, tente brew switch python [previous version], por exemplo brew switch python 3.6.5. Daqui.

ryan
fonte
4

instruções virtualenvwrapper

Conforme indicado na resposta aceita, a causa raiz provavelmente é uma atualização de homebrew que significa que os links simbólicos do virtualenv estão apontando para caminhos de python quebrados - veja detalhes aqui .

Para cada ambiente virtual, é necessário reatribuir os links simbólicos para apontar para o caminho python correto (na adega de fermentação). Aqui está como fazer isso com o virtualenvwrapper . Aqui estou atualizando um ambiente virtual chamado "my-example-env".

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

Tudo feito.

arcseldon
fonte
4

Qualquer pessoa que esteja usando o pipenv (e você deve!) Pode simplesmente usar esses dois comandos - sem ter o venv ativado:

rm -rf `pipenv --venv` # remove the broken venv
pipenv install --dev   # reinstall the venv from pipfile 
Robotnik
fonte
1
você também pode usar pipenv --rmna pasta de sua env e depoispipenv install --dev
Handfeger
2

Se você quebrou o python3, tente corrigi- brew upgrade python3lo para mim.

jmoz
fonte
2

Eu recentemente enfrentei isso. Nenhuma das soluções acima funcionou para mim. Parece que não era realmente problema do Python. Quando eu estava executando

aws s3 ls

, estava recebendo o seguinte erro:

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

Isso significa que o awsexecutável da biblioteca está apontando para ou não existe ou está corrompido; portanto, desinstalei e reinstalei aws-cliseguindo as instruções deste link e funcionou !!

thekosmix
fonte
2

O problema para mim (usuário do MacOS) é que brewatualizei os links Python e virtualenvs para a versão antiga que foi excluída.

Podemos verificar e corrigi-lo

>> 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
Yihe
fonte
Isso também trabalhou para corrigir links quebrados após a instalação do Python 3.7 em um sistema que tinha Python3.6
lukik
2

Eu tive um problema semelhante e o resolvi apenas reconstruindo o ambiente virtual com virtualenv .

dorinjj
fonte
Bem-vindo ao SO. Apesar de agradecermos sua resposta, seria melhor se ela fornecesse valor adicional além das outras respostas. Nesse caso, sua resposta não fornece valor adicional, pois outro usuário já postou essa solução. Se a resposta anterior foi útil para você, você deve votar-lo uma vez que você tem bastante reputação
David Buck
1

Usando o Python 2.7.10.

Um único comando virtualenv path-to-envfaz isso. documentação

$ 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.
Ayush Goel
fonte
1

Eu tinha um ambiente virtual quebrado devido a uma reinstalação Homebrew de python (com isso, links simbólicos quebrados) e também alguns "sudo pip install" que eu havia feito anteriormente. As dicas de Weizhong foram muito úteis para corrigir os problemas sem precisar reinstalar os pacotes. Eu também tive que fazer o seguinte para o problema de permissões mistas.

sudo chown -R nome_do_usuário lib / python2.7 / site-packages

P. Gabbur
fonte
Se estiver complementando as respostas de outro usuário, deixe um comentário para ele, para que ele possa editar! Boa contribuição.
Francisco Peters
Ele não tem pontos de reputação suficientes para comentar uma resposta.
Tyler Smith
1

Virtualenvs estão quebrados. Às vezes, a maneira mais simples é excluir as pastas venv e recriar virutalenvs.

auraz
fonte
1

Se você estiver usando o pipenv, apenas pipenv --rmresolva o problema.

ashdaily
fonte
0

A resposta aceita não funciona para mim: o arquivo $WORKON_HOME/*/bin/python2.7não é mais um link simbólico, é um executável completo:

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

A solução é, infelizmente, remover completamente e recriar do zero todos os os ambientes virtuais.

Para referência:

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
sds
fonte
Eu acho que é porque esta solução não é obsoleta - eu apenas tentei e resolvi o meu problema. Além disso, acho que se você não tiver links simbólicos, não verá o erro descrito aqui; portanto, este comentário não se torna uma solução, mas uma distração - Só porque você tem uma versão mais recente, não significa que todo mundo tenha. Esse é o meu palpite por que o downvote :)
RafazZ
@ RafazZ: Espero que agora esteja melhor. No entanto, eu me pergunto por que ainda é um link simbólico para você. E sim, recebo esse erro porque o virtualenv python está vinculado às libs de python de estoque.
Sd
Eu acho que o comportamento padrão ainda é criar links simbólicos e você precisa de um --always-copyargumento para substituí-lo. Pelo menos o que eu recebi do Guia do usuário
RafazZ
@RafazZ: Eu nunca usei --always-copye tenho arquivos regulares :-(
sds
0

Simplesmente atualizar o python3 funcionou para mim:

brew upgrade python3
Flavio Wuensche
fonte
0

Eu tentei os poucos métodos principais, mas eles não funcionaram para mim, que estavam tentando fazer o tox funcionar. O que acabou por funcionar foi:

sudo pip install tox

mesmo se o tox já estiver instalado. A saída terminou com:

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
Marco
fonte
0

O que o corrigiu foi apenas desinstalar o python3 e o pipenv e reinstalá-los.

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

Todas as respostas são ótimas aqui, tentei algumas das soluções mencionadas acima por Ryan, Chris e não consegui resolver o problema, por isso tive que seguir um caminho rápido e sujo.

  1. rm -rf <project dir>(ou mv <project dir> <backup projct dir>se você deseja manter um backup)
  2. git clone <project git url>
  3. Ir em frente!

Nada de romance aqui, mas facilita a vida!

avp
fonte
0

Estou certo de que estou atrasado para a festa, mas quero dizer que a resolução deste problema é muito mais simples do que discutido aqui.

Você pode regenerar facilmente o ambiente virtual sem precisar excluir / editar nada. Supondo que o seu ambiente quebrado seja chamado, env_to_fixvocê pode apenas o seguinte:

mkvirtualenv env_to_fix

Isso regenerará os links e corrigirá o ambiente sem a necessidade de despejar o status atual em algum lugar e restaurá-lo.

Fabiano Francesconi
fonte
0

Me deparei com o mesmo problema quando estava apontando o tempo de execução do python de 2 para 3 no meu mac, apontando o alias python para o caminho python 3. Depois, recrio um novo virtualenv e reinstale os pacotes necessários para o meu projeto. Para o meu caso de uso, tive um programa python escrevendo na planilha do google. Limpe alguns pacotes diferentes da implementação do python 2 e, tudo começou a funcionar novamente.

black_ray
fonte