Riferimenti rotti in Virtualenvs


238

Di recente ho installato un sacco di dotfile sul mio Mac insieme ad alcune altre applicazioni (ho cambiato iTerm invece di Terminal e Sublime come editor di testo predefinito) ma da allora tutti i miei ambienti virtuali hanno smesso di funzionare, sebbene le loro cartelle all'interno di .virtualenvs sono ancora lì e danno il seguente errore ogni volta che provo a eseguire qualcosa in loro:

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

Ho rimosso tutti i file relativi ai dotfile e ho ripristinato il mio .bash_profile a quello che era prima, ma il problema persiste. Esiste un modo per diagnosticare il problema o risolverlo in modo semplice (ad esempio, non è necessario creare di nuovo tutti i VirtualVen)?



Grazie per il commento, @unubtu. Questo è sicuramente utile. Ma non sono nemmeno in grado di creare nuovi virtual virtual. Il mio rmvirtualenvfunziona ancora, ma quando mkvirtualenvprovo a correre , ottengo il seguente errore: -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 Quindi, sembra un problema con i miei percorsi Python ma non riesco a vedere dove si trova il problema, dal momento che posso eseguire Python e sembra che vada bene.
Oxtay,

1
[aggiornamento] Potrei aver trovato il problema ma non sono sicuro e in realtà non sono sicuro di come risolverlo. Sembra che tutti i virtualenvcomandi stiano funzionando ora in teoria, ma dal momento che c'è un problema con Python, non fanno nulla. Quindi il vero problema è con il pitone di birra. E ho il sospetto che il motivo sia dovuto a un cambio di nome nelle directory di Python. Per qualche ragione, tutti questi comandi sono alla ricerca di Python nella cartella /usr/local/Cellar/python/2.7.6ma il nome della cartella è in realtà /usr/local/Cellar/python/2.7.6_1.
Oxtay,

Dato che sono un principiante, non so quanto sia rischioso cambiare manualmente il nome da 2.7.6_1 a 2.7.6 e vedere cosa succede.
Oxtay,

Dovreste essere in grado di rinominare 2.7.6_1a 2.7.6. Se il peggio diventasse il peggio, potresti rinominarlo.
unutbu,

Risposte:


370

Ho trovato la soluzione al problema qui , quindi tutto il merito va all'autore.

L'essenza è che quando si crea un virtualenv, vengono creati molti collegamenti simbolici al Python installato da Homebrew.

Ecco un esempio:

$ 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 aggiorni Python usando Homebrew e poi esegui brew cleanup, i collegamenti simbolici in virtualenv puntano a percorsi che non esistono più (perché Homebrew li ha eliminati).

I collegamenti simbolici devono puntare al Python appena installato:

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 soluzione è rimuovere i collegamenti simbolici in virtualenv e quindi ricrearli:

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

Probabilmente è meglio controllare quali collegamenti verranno eliminati prima di eliminarli:

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

A mio avviso, è ancora meglio eliminare solo i collegamenti simbolici rotti. Puoi farlo usando GNU find:

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

Puoi installare GNU findcon Homebrew se non l'hai già:

brew install findutils

Si noti che per impostazione predefinita, i programmi GNU installati con Homebrew tendono ad avere il prefisso con la lettera g. Questo per evitare di oscurare il findbinario fornito con OS X.


4
Il +1 gfindera perfetto, dato che avevo molti symlink ininterrotti (ad esempio, nodeenv) che non volevo cancellare
2

3
Un altro modo per rimuovere i collegamenti simbolici non funzionanti è utilizzare la ricerca standard:find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm
vdboor

Ho eliminato la mia intera directory virtualenv. ora non riesco a rimuovere i symlink. Nessuna delle soluzioni menzionate in questa pagina funziona per me su Mac. ottengo ancora lo stesso errore "immagine non trovata. Abort trap: 6"
Aseem,

Questi passaggi non hanno funzionato abbastanza per me:pip3 freeze dyld: lazy symbol binding failed: Symbol not found: __Py_UnixMain
deed02392

1
Per aggiungere, se l'ENV era con Python 2, eseguilo con argomento virtualenv ~/.virtualenvs/foo -p python2
:,

41

Dopo aver provato alcune cose, questo ha funzionato per me:

vai alla tua directory virtualenv (ma non eseguire workon):

cd ~/.virtualenv/name_of_broken_venv

Ora cancella questi file:

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

Quindi per ricostruire il tuo Venv, esegui:

virtualenv .
workon name_of_broken_venv
pip freeze

Ora dovresti vedere di nuovo un elenco dei pacchetti installati.


FWIW, ho appena provato questo approccio dopo l'aggiornamento a El Capitan e la reinstallazione di homebrew, e il mio elenco di pacchetti non è stato conservato.
Ryan

1
con pipenv puoi rimuovere facendo pipenv --rme ricreare pipenv shell,pipenv install
Harry Moreno,

14

Ciò si è verificato durante l'aggiornamento a Mac OS X Mavericks di Snow Leopard. Ho dovuto reinstallare anche la birra in anticipo. Spero che tu abbia eseguito il comando freeze per il tuo progetto con pip.

Per risolvere, è necessario aggiornare i percorsi a cui punta l'ambiente virtuale.

  • Installa una versione di Python con brew:

brew install python

  • Reinstalla virtualenvwrapper.

pip install --upgrade virtualenvwrapper

  • Rimosso il vecchio ambiente virtuale:

rmvirtualenv old_project

  • Crea un nuovo ambiente virtuale:

mkvirtualenv new_project

  • Lavora su un nuovo ambiente virtuale

workon new_project

  • Utilizzare pip per installare i requisiti per il nuovo progetto.

pip install -r requirements.txt

Questo dovrebbe lasciare il progetto com'era prima.


Questo era un po 'di tempo fa e credo di aver fatto qualcosa del genere, ma dato che all'epoca non avevo eseguito' pip freeze> Requisito.txt ', non era la soluzione più efficiente. Lezione imparata.
Oxtay,

13

La @Chris Wedgwoodrisposta di una versione di aggiornamento da conservare site-packages(mantenere i pacchetti installati)

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
Questo è oltre la perfezione. Aiuta a migrare la versione di Python mantenendo tutti i pacchetti. Se stai seguendo questo, non eseguire le istruzioni di @Chris Wedgewood.
Harish Prasanna,

10

Sembra che il modo corretto di risolvere questo problema sia quello di eseguire

 pip install --upgrade virtualenv

dopo aver aggiornato Python con Homebrew.

Questa dovrebbe essere una procedura generale per qualsiasi formula che installa qualcosa come Python, che ha il proprio sistema di gestione dei pacchetti. Quando si installa brew install python, si installa pythone pipe easy_installe virtualenve così via. Quindi, se quegli strumenti possono essere auto-aggiornati, è meglio provare a farlo prima di guardare Homebrew come fonte di problemi.


Ciò ha funzionato per un problema con setuptools, in particolare: Avviso: impossibile trovare la posizione svn per setuptools == 0.6c12dev-r88846
Robert Brisita

1
Ho applicato questa soluzione, seguita dalla corsa: virtualenv . nel mio ambiente virtuale rotto. La versione aggiornata di virtualenvallora ha ricreato le dipendenze necessarie ed ero a posto. Questo processo è stato più autogestito e robusto della risposta accettata per me.
christang,

Nel 2020, questa è ancora la risposta.
scubabuddha,

7

Se questo è stato causato da un brew upgradePython che ha aggiornato e sei a posto con il downgrade alla versione precedente, prova brew switch python [previous version]ad es brew switch python 3.6.5. Da qui.


4

istruzioni virtualenvwrapper

Come indicato nella risposta accettata, la causa principale è probabilmente un aggiornamento homebrew che significa che i collegamenti simbolici virtualenv puntano a percorsi python interrotti - vedi i dettagli qui .

Per ogni ambiente virtuale, è necessario riassegnare i collegamenti simbolici in modo che puntino al percorso python corretto (nella birreria). Ecco come farlo con virtualenvwrapper . Qui sto aggiornando un env virtuale chiamato "my-example-env".

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

Tutto fatto.


4

Chiunque usi pipenv (e dovresti!) Può semplicemente usare questi due comandi - senza che venv sia attivato:

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

1
puoi anche usarlo pipenv --rmnella cartella del tuo env e poipipenv install --dev
Handfeger,

2

Se hai eliminato Python3, prova a risolverlo brew upgrade python3.


2

Di recente ho affrontato questo. Nessuna delle soluzioni sopra ha funzionato per me. Sembra che in realtà non fosse un problema di Python. Quando stavo correndo

aws s3 ls

stavo ricevendo il seguente errore:

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

Questo significa che l' awseseguibile della libreria verso cui punta o non esiste o è danneggiato, quindi ho disinstallato e reinstallato aws-cliseguendo le istruzioni da questo link e ha funzionato !!


2

Il problema per me (un utente MacOS) è che brewi collegamenti Python e virtualenvs sono stati aggiornati alla versione precedente che è stata eliminata.

Possiamo verificarlo e risolverlo tramite

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

Questo ha funzionato anche per correggere i collegamenti interrotti dopo l'installazione di Python 3.7 su un sistema con Python3.6
lukik

2

Ho avuto un problema simile e l'ho risolto semplicemente ricostruendo l'ambiente virtuale con virtualenv .


Benvenuti in SO. Sebbene ti ringraziamo per la tua risposta, sarebbe meglio se fornisse un valore aggiuntivo rispetto alle altre risposte. In questo caso, la tua risposta non fornisce un valore aggiuntivo, poiché un altro utente ha già pubblicato quella soluzione. Se una risposta precedente ti è stata utile, dovresti votare una volta che hai abbastanza reputazione
David Buck,

1

Utilizzo di Python 2.7.10.

Un singolo comando lo virtualenv path-to-envfa. documentazione

$ 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

Ho avuto un env virtuale rotto a causa di una reinstallazione Homebrew di Python (quindi collegamenti simbolici rotti) e anche di alcune "installazioni sudo pip" che avevo fatto in precedenza. I suggerimenti di Weizhong sono stati molto utili per risolvere i problemi senza dover reinstallare i pacchetti. Ho anche dovuto fare quanto segue per il problema delle autorizzazioni miste.

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


Se stai completando le risposte di un altro utente, dovresti lasciare un commento per loro in modo che possano modificarlo! Bel contributo.
Francisco Peters,

Non ha abbastanza punti reputazione per commentare una risposta.
Tyler Smith,

1

Virtualenvs sono rotti. A volte il modo semplice è quello di eliminare le cartelle venv e ricreare virutalenvs.


1

Se si utilizza pipenv, solo risolvendo pipenv --rmil problema.



0

La risposta accettata non funziona per me: il file $WORKON_HOME/*/bin/python2.7non è più un collegamento simbolico, è un eseguibile a tutti gli effetti:

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

La soluzione è purtroppo quella di rimuovere completamente e ricreare da zero tutto gli ambienti virtuali.

Per il riferimento:

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

Immagino sia perché questa soluzione non è obsoleta, l'ho appena provata e risolto il mio problema. Inoltre, penso che se non si dispone di collegamenti simbolici, non vedrai l'errore descritto qui, quindi questo commento diventa non una soluzione ma una distrazione - Solo perché hai una versione più recente, non significa che tutti lo facciano. Questa è la mia ipotesi sul perché il downvote :)
RafazZ,

@RafazZ: spero sia meglio ora. Tuttavia, mi chiedo perché sia ​​ancora un collegamento simbolico per te. E sì, ricevo questo errore perché virtualenv python è collegato alle librerie stock di Python.
sd,

Penso che il comportamento predefinito sia ancora quello di creare collegamenti simbolici e hai bisogno di un --always-copyargomento per sovrascriverlo. Almeno quello che ho ottenuto dalla Guida per l'utente
RafazZ,

@RafazZ: Non ho mai usato --always-copye ho file regolari :-(
sds


0

Ho provato i primi metodi, ma non hanno funzionato, per me, che stavano cercando di far funzionare tox. Ciò che alla fine ha funzionato è stato:

sudo pip install tox

anche se tox era già installato. L'output è terminato con:

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

Ciò che l'ha risolto per me è stato semplicemente disinstallare python3 e pipenv, quindi reinstallarli.

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

0

Tutte le risposte sono ottime qui, ho provato un paio di soluzioni sopra menzionate da Ryan, Chris e non sono riuscito a risolvere il problema, quindi ho dovuto seguire un modo rapido e sporco.

  1. rm -rf <project dir>(o mv <project dir> <backup projct dir>se si desidera conservare un backup)
  2. git clone <project git url>
  3. Vai avanti!

Niente di nuovo qui, ma semplifica la vita!


0

Sono sicuro di essere in ritardo alla festa, ma voglio dire che la risoluzione di questo problema è molto più semplice di quanto discusso qui.

Puoi facilmente rigenerare l'ambiente virtuale senza dover eliminare / modificare nulla. Supponendo che venga chiamato il tuo ambiente danneggiato, env_to_fixpuoi semplicemente:

mkvirtualenv env_to_fix

Ciò rigenererà i collegamenti e risolverà l'ambiente senza la necessità di scaricare da qualche parte lo stato corrente e ripristinarlo.


0

Mi sono imbattuto nello stesso problema quando indicavo il tempo di esecuzione di Python da 2 a 3 sul mio Mac, indicando l'alias python sul percorso di Python 3. Ricreare quindi un nuovo virtualenv e reinstallare i pacchetti necessari per il mio progetto. Per il mio caso d'uso ho avuto un programma Python che scriveva sul foglio di Google. Elimina alcuni pacchetti che sono diversi dall'implementazione di python 2 e quindi, le cose hanno ripreso a funzionare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.