Virtualenvs'te bozuk referanslar


238

Kısa bir süre önce Mac'ime bir grup dotfiles yükledim ve diğer bazı uygulamalarla (Terminal yerine iTerm olarak değiştirdim ve varsayılan metin düzenleyicim olarak Sublime'ı değiştirdim), ancak o zamandan beri, klasörlerindeki .virtualenvs içindeki tüm sanal ortamlarım çalışmayı durdurdu hala orada ve ne zaman bir şey çalıştırmaya çalıştığınızda aşağıdaki hata veriyorlar:

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

Dotfiles ile ilgili tüm dosyaları kaldırdım ve daha önce olduğu gibi .bash_profile geri yükledim, ancak sorun devam ediyor. Sorunu teşhis etmenin veya kolay bir şekilde çözmenin herhangi bir yolu var mı (örneğin, tüm sanal sunucuları tekrar oluşturmayı gerektirmemek)?



Yorum için teşekkürler, @ unubtu. Bu kesinlikle yardımcı olur. Fakat yeni sanal videolar da yapamıyorum. Benim rmvirtualenvhala çalışıyor ama çalıştırmaya çalışırken mkvirtualenv, aşağıdaki hatayı alıyorum: -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 Yani, benim python yolları ile ilgili bir sorun gibi görünüyor ama ben python çalıştırabilir ve iyi görünüyor çünkü sorunun nerede olduğunu göremiyorum.
oxtay

1
[güncelleme] Sorunu bulmuş olabilirim ama emin değilim ve aslında nasıl düzelteceğimi bilmiyorum. Görünüşe göre tüm virtualenvkomutlar teoride çalışıyor, ancak python ile ilgili bir sorun olduğu için hiçbir şey yapmıyorlar. Yani asıl sorun demlemek için piton. Ve bunun nedeninin python dizinlerindeki isim değişikliğinden şüpheleniyorum. Bazı nedenlerden dolayı, tüm bu komutlar klasörde python arıyor /usr/local/Cellar/python/2.7.6ancak klasörün adı aslında /usr/local/Cellar/python/2.7.6_1.
oxtay

Acemi olduğum için, adı 2.7.6_1'den 2.7.6'ya manuel olarak değiştirmenin ve ne olduğunu görmenin ne kadar riskli olduğunu bilmiyorum.
oxtay

Yeniden adlandırabilmeniz 2.7.6_1gerekir 2.7.6. Daha kötüsü en kötüsüyse, yeniden adlandırabilirsiniz.
unutbu

Yanıtlar:


369

Sorunun çözümünü burada buldum , bu yüzden tüm kredi yazara gidiyor.

Amaç, bir sanalenv oluşturduğunuzda, Homebrew yüklü Python'a birçok sembolün yaratılmasıdır.

İşte bir örnek:

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

Python'u Homebrew kullanarak yükseltip çalıştırdığınızda brew cleanup, sanal bağlantıdaki semboller artık var olmayan yollara işaret ediyor (Homebrew onları sildiğinden).

Simgelerin yeni kurulan Python'u göstermesi gerekir:

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

Çözüm, virtualenv'deki sembol bağlantılarını kaldırmak ve daha sonra yeniden oluşturmaktır:

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

Silmeden önce hangi bağlantıların silineceğini kontrol etmek muhtemelen en iyisidir:

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

Benim düşünceme göre, sadece kırık sembolik bağlantıları silmek daha da iyidir. Bunu GNU kullanarak yapabilirsiniz find:

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

findZaten sahip değilseniz GNU'yu Homebrew ile kurabilirsiniz :

brew install findutils

Varsayılan olarak, Homebrew ile yüklenen GNU programlarının harfle ön ekli olduğuna dikkat edin g. Bu findOS X ile birlikte gelen ikili gölgelemeyi önlemek içindir .


4
+1 gfind, mükemmeldi, çünkü silmek istemediğim bir çok kesintisiz sembolüm (örn. Nodeenv) olduğu için
2Toad

3
Kırık sembolik bağlantıları kaldırmak için başka bir yol standart find kullanıyor:find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm
vdboor

Virtualenv dizinimin tamamını sildim. şimdi sembolik bağlantıları kaldıramıyorum. Bu sayfada belirtilen çözümlerin hiçbiri mac üzerinde çalışmıyor. hala aynı hatayı alıyorum "resim bulunamadı. Durdurma tuzağı: 6"
Aseem

Bu adımlar benim için pek işe yaramadı:pip3 freeze dyld: lazy symbol binding failed: Symbol not found: __Py_UnixMain
deed02392

1
Env, Python 2 ile ise, argüman ile çalıştırın:, virtualenv ~/.virtualenvs/foo -p python2aksi takdirde Python 3'ü kullanır.
Bohumir Zamecnik

41

Birkaç şeyi denedikten sonra, bu benim için çalıştı:

virtualenv dizininize gidin (ancak workon'u çalıştırmayın):

cd ~/.virtualenv/name_of_broken_venv

Şimdi şu dosyaları silin:

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

Sonra venv yeniden oluşturmak için çalıştırın:

virtualenv .
workon name_of_broken_venv
pip freeze

Şimdi kurulu paketlerinizin bir listesini tekrar görmelisiniz.


FWIW, El Capitan'a yükselttikten ve homebrew'u tekrar yükledikten sonra bu yaklaşımı denedim ve paket listem korunmadı.
Ryan

1
pipenv ile yaparak pipenv --rmve yeniden oluşturabilirsiniz pipenv shell,,pipenv install
Harry Moreno

14

Bu, Snow Leopard'dan Mac OS X Mavericks'e güncellediğimde meydana geldi. Demlemeyi de önceden takmak zorunda kaldım. Umarım pip ile projeniz için dondurma komutunu çalıştırdınız.

Çözümlemek için sanal ortamın işaret ettiği yolları güncellemeniz gerekir.

  • Demleme ile bir python sürümü yükleyin:

brew install python

  • Virtualenvwrapper'ı yeniden yükleyin.

pip install --upgrade virtualenvwrapper

  • Eski sanal ortam kaldırıldı:

rmvirtualenv old_project

  • Yeni bir sanal ortam oluşturun:

mkvirtualenv new_project

  • Yeni sanal ortam üzerinde çalışın

workon new_project

  • Yeni proje için gereksinimleri yüklemek üzere pip kullanın.

pip install -r requirements.txt

Bu, projeyi daha önce olduğu gibi bırakmalıdır.


Bu bir süre önceydi ve sonunda bu çizgiler boyunca bir şeyler yaptığımı düşünüyorum, ama o zamana kadar 'pip freeze> gereksinimleri.txt' çalıştırmadım, bu en verimli çözüm değildi. Ders öğrenildi.
oxtay

13

Güncelleme sürümünün @Chris Wedgwoodyanıtı tutma site-packages(paketleri kurulu tutma)

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
Bu mükemmelliğin ötesinde. Tüm paketleri korurken python sürümünü geçirmeye yardımcı olur. Bunu takip ediyorsanız, @Chris Wedgewood'un talimatlarını uygulamayın.
Harish Prasanna

10

Görünen bu sorunu çalıştırmak için çözmek için uygun bir yol

 pip install --upgrade virtualenv

Homebrew ile python'u yükselttikten sonra.

Bu, kendi paket yönetim sistemine sahip python gibi bir şey yükleyen herhangi bir formül için genel bir prosedür olmalıdır. Yüklediğinizde brew install python, yüklersinizpython ve pipve easy_installve virtualenvve böyle devam eder. Bu nedenle, bu araçlar kendi kendini güncelleyebiliyorsa, Homebrew'a sorunların kaynağı olarak bakmadan önce bunu yapmaya çalışmak en iyisidir.


Bu, özellikle kurulum araçlarıyla ilgili bir sorun için çalıştı: Uyarı: setuptools için svn konumu bulamıyor == 0.6c12dev-r88846
Robert Brisita

1
Bu çözümü uyguladım, ardından çalışıyorum: virtualenv . kırık sanal ortamımda. Güncellenmiş sürümü virtualenvdaha sonra gerekli bağımlılıkları yeniden yarattı ve gitmek için iyi oldu. Bu süreç benim için kabul edilen cevaptan daha fazla kendi kendini yöneten ve sağlamdı.
christang

2020'de bu hala cevap.
scubabuddha

7

Buna brew upgradePython'u yükselten bir şey neden olmuşsa ve önceki sürüme geçme konusunda sorun yaşıyorsanız brew switch python [previous version], örn brew switch python 3.6.5. Buradan.


4

sargılayıcı talimatları

Kabul edilen cevapta belirtildiği gibi, temel neden muhtemelen bir homebrew güncellemesidir, bu da sanalen bağlantılarınızın bozuk python yollarını işaret ettiği anlamına gelir - ayrıntılara buradan bakın .

Her sanal ortam için, sembol bağlantılarını doğru python yolunu (demleme mahzeninde) gösterecek şekilde yeniden atamanız gerekir. Virtualenvwrapper ile bunu nasıl yapacağınız aşağıda açıklanmıştır . Burada "my-example-env" adlı sanal bir env'yi güncelliyoruz.

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

Hepsi tamam.


4

Pipenv kullanan herkes (ve siz yapmalısınız!) Venv'yi etkinleştirmeden şu iki komutu kullanabilir:

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

1
ayrıca pipenv --rmpipenv install --dev
env'nizin

2

Python3'ü yakaladıysanız brew upgrade python3, bunu düzeltmeyi benim için deneyin .


2

Son zamanlarda bununla karşılaştım. Yukarıdaki çözümlerin hiçbiri benim için işe yaramadı. Görünüşe göre aslında Python'un sorunu değildi. Ben çalışmaya devam ederken

aws s3 ls

aşağıdaki hatayı başlamıştı:

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

Bu araçlar, kütüphane awsyürütülebilir ya yok edilir işaret ediyor veya bozuk, dolayısıyla ben kaldırıldı ve yeniden aws-cliaşağıdaki talimatları bu bağlantı ve işe yaradı !!


2

Benim için sorun (bir MacOS kullanıcısı), brewPython ve virtualenvs bağlantılarının silinmiş eski sürüme güncellenmesidir.

Kontrol edebilir ve düzeltebiliriz

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

Bu ayrıca Python 3.7'yi Python3.6 olan bir sisteme yükledikten sonra bozuk bağlantıları düzeltmek için çalıştı
lukik

2

Benzer bir sorunum vardı ve sadece sanal ortamı yeniden inşa ederek çözdüm virtualenv .


SO hoş geldiniz. Cevabınız için teşekkür etmemize rağmen, diğer cevapların üzerine ek değer katması daha iyi olur. Bu durumda, başka bir kullanıcı bu çözümü zaten gönderdiğinden cevabınız ek değer sağlamaz. Önceki bir yanıt size yardımcı olduysa , yeterli itibara
David Buck

1

Python Kullanma 2.7.10.

Tek bir komut virtualenv path-to-envbunu yapar. belgeleme

$ 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

Bir Homebrew python (böylece kırık semboller) yeniden yükleme ve ayrıca daha önce yapmış birkaç "sudo pip install" s nedeniyle kırık bir sanal env vardı. Weizhong'un ipuçları, paketleri yeniden yüklemek zorunda kalmadan sorunları çözmede çok yardımcı oldu. Ayrıca karışık izinler sorunu için aşağıdakileri yapmak zorunda kaldım.

sudo chown -R my_kullaniciadi lib / python2.7 / site paketleri


Başka bir kullanıcının yanıtlarını tamamlıyorsanız, düzenlemeleri için kendilerine bir yorum bırakmalısınız! Güzel katkı.
Francisco Peters

Bir cevap hakkında yorum yapmak için yeterli itibar puanı yok.
Tyler Smith

1

Sanal görüntüler bozuldu. Bazen basit bir yol venv klasörlerini silmek ve virutalenvs yeniden oluşturmaktır.


1

Pipenv kullanıyorsanız, sadece pipenv --rmsorunu çözer.



0

Kabul edilen cevap benim için çalışmıyor: dosya $WORKON_HOME/*/bin/python2.7artık bir sembolik bağlantı değil, tam teşekküllü bir yürütülebilir dosyadır :

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

Solüsyon tamamen kaldırıp sıfırdan yeniden oluşturmak için, ne yazık olduğunu bütün sanal ortamları .

Referans için:

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

Sanırım çünkü bu çözüm eski değil - sadece denedim ve sorunumu düzeltti. Ayrıca, sembolik bağlarınız yoksa, burada açıklanan hatayı görmeyeceğinizi düşünüyorum, bu yüzden bu yorum bir çözüm değil, dikkat dağıtıcı bir şey - Sadece daha yeni bir sürümünüz olması, herkesin yaptığı anlamına gelmez. Bu benim tahmin neden downvote :)
RafazZ

@RafazZ: Umarım şimdi daha iyidir. Ancak, neden hala sizin için bir sembolik olduğunu merak ediyorum. Ve evet, bu hatayı alıyorum çünkü virtualenv python stok python libs ile bağlantılı.
sds

Varsayılan davranışın hala sembolik bağlantılar oluşturmak olduğunu düşünüyorum ve --always-copygeçersiz kılmak için bir argümana ihtiyacınız var. En azından Kullanıcı Kılavuzu'ndan
RafazZ

@RafazZ: Hiç kullanmadım --always-copyve düzenli dosyalarım var :-(
sds


0

En iyi birkaç yöntemi denedim, ama benim için işe yaramadılar, ki bu da toksik işi yapmaya çalışıyorlardı. Sonunda işe yarayan şey:

sudo pip install tox

Zaten yüklü olsa bile. Çıktı şu şekilde sona erdi:

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

Benim için ne düzeltti sadece python3 ve pipenv kaldırma sonra onları yeniden oldu.

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

0

Tüm cevaplar burada harika, yukarıda Ryan, Chris tarafından belirtilen birkaç çözümü denedim ve sorunu çözemedim, bu yüzden hızlı ve kirli bir şekilde takip etmek zorunda kaldım.

  1. rm -rf <project dir>(veya mv <project dir> <backup projct dir>yedek tutmak istiyorsanız)
  2. git clone <project git url>
  3. Devam et!

Burada yeni bir şey yok, ama hayatı kolaylaştırıyor!


0

Eminim partiye geç kaldım ama bu sorunun çözümünün burada tartışılandan çok daha basit olduğunu söylemek istiyorum.

Hiçbir şeyi silmek / düzenlemek zorunda kalmadan sanal ortamı kolayca yeniden oluşturabilirsiniz. Bozuk ortamınızın çağrıldığını varsayarsak env_to_fix, aşağıdakileri yapabilirsiniz:

mkvirtualenv env_to_fix

Bu, mevcut durumu bir yere dökmeye ve geri yüklemeye gerek kalmadan bağlantıları yeniden oluşturur ve ortamı düzeltir.


0

Python çalışma zamanımı mac'umda 2'den 3'e, takma python'u python 3 yoluna işaret ederken aynı sorunla karşılaştım. Daha sonra yeni bir virtualenv yeniden oluşturur ve projem için ihtiyacım olan paketleri yeniden yüklerim. Benim kullanım durum için google sayfasına yazma bir python programı oldu. Python 2 uygulaması ve wa la farklı birkaç paket temizlemek, işler tekrar çalışmaya başladı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.