Referensi yang rusak di Virtualenvs

238

Saya baru-baru ini menginstal sekelompok dotfile pada Mac saya bersama dengan beberapa aplikasi lain (saya berubah menjadi iTerm bukan Terminal, dan Sublime sebagai editor teks default saya) tetapi sejak itu, semua lingkungan virtual saya telah berhenti bekerja, meskipun folder mereka di dalam .virtualenvs masih ada dan mereka memberikan kesalahan berikut setiap kali saya mencoba menjalankan apa pun di dalamnya:

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

Saya telah menghapus semua file yang terkait dengan dotfiles dan telah memulihkan .bash_profile saya seperti sebelumnya, tetapi masalahnya tetap ada. Apakah ada cara untuk mendiagnosis masalah atau menyelesaikannya dengan cara yang mudah (mis. Tidak perlu membuat semua virtualenv lagi)?

lembu
sumber
Terima kasih atas komentarnya, @unubtu. Ini tentu sangat membantu. Tapi saya juga tidak bisa membuat virtualenvs baru. Saya rmvirtualenvmasih berfungsi tetapi ketika mencoba menjalankan mkvirtualenv, saya mendapatkan kesalahan berikut: -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 Jadi, sepertinya ada masalah dengan jalur python saya tapi saya tidak bisa melihat di mana masalahnya, karena saya bisa menjalankan python dan sepertinya baik-baik saja.
oxtay
1
[pembaruan] Saya mungkin menemukan masalah tetapi saya tidak yakin dan saya benar-benar tidak yakin bagaimana cara memperbaikinya. Tampaknya semua virtualenvperintah sekarang bekerja dalam teori, tetapi karena ada masalah dengan python, mereka tidak melakukan apa-apa. Jadi masalah sebenarnya adalah dengan python brew. Dan saya curiga alasannya adalah karena perubahan nama pada direktori python. Untuk beberapa alasan, semua perintah ini mencari python di folder /usr/local/Cellar/python/2.7.6tetapi nama folder sebenarnya /usr/local/Cellar/python/2.7.6_1.
oxtay
Karena saya seorang pemula, saya tidak tahu seberapa risikonya mengubah nama secara manual dari 2.7.6_1 menjadi 2.7.6 dan melihat apa yang terjadi.
oxtay
Anda harus dapat mengganti nama 2.7.6_1menjadi 2.7.6. Jika lebih buruk menjadi terburuk, Anda bisa mengganti namanya kembali.
unutbu

Jawaban:

370

Saya menemukan solusi untuk masalah ini di sini , jadi semua kredit diberikan kepada penulis.

Intinya adalah ketika Anda membuat virtualenv, banyak symlink dibuat untuk Python Homebrew yang terinstal.

Ini salah satu contohnya:

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

Ketika Anda memutakhirkan Python menggunakan Homebrew dan kemudian jalankan brew cleanup , symlink di titik virtualenv ke jalur yang tidak ada lagi (karena Homebrew menghapusnya).

Symlinks perlu mengarah ke Python yang baru diinstal:

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

Solusinya adalah menghapus symlink di virtualenv dan kemudian membuatnya kembali:

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

Mungkin yang terbaik untuk memeriksa tautan apa yang akan dihapus terlebih dahulu sebelum menghapusnya:

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

Menurut pendapat saya, lebih baik menghapus symlink yang rusak saja. Anda dapat melakukan ini menggunakan GNU find:

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

Anda dapat menginstal GNU finddengan Homebrew jika Anda belum memilikinya:

brew install findutils

Perhatikan bahwa secara default, program GNU yang diinstal dengan Homebrew cenderung diawali dengan huruf g. Ini untuk menghindari membayangi findbiner yang dikirimkan dengan OS X.

Ryan Kaskel
sumber
4
+1 gfindsempurna, karena saya memiliki banyak symlink yang tidak terputus (mis., Nodeenv) yang tidak ingin saya hapus
2Toad
3
Cara lain untuk menghapus symlink yang rusak adalah menggunakan find standar:find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm
vdboor
Saya menghapus seluruh dir virtualenv saya. sekarang saya tidak bisa menghapus symlink. Tidak ada solusi yang disebutkan di halaman ini yang berfungsi untuk saya di mac. saya masih mendapatkan kesalahan yang sama "gambar tidak ditemukan. Abort trap: 6"
Aseem
Langkah-langkah ini tidak berhasil bagi saya:pip3 freeze dyld: lazy symbol binding failed: Symbol not found: __Py_UnixMain
deed02392
1
Hanya untuk menambahkan, jika env dengan Python 2, jalankan dengan argumen virtualenv ~/.virtualenvs/foo -p python2
:,
41

Setelah mencoba beberapa hal, ini berhasil bagi saya:

buka direktori virtualenv Anda (tetapi jangan jalankan workon):

cd ~/.virtualenv/name_of_broken_venv

Sekarang hapus file-file ini:

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

Kemudian untuk membangun kembali venv Anda, jalankan:

virtualenv .
workon name_of_broken_venv
pip freeze

Anda sekarang akan melihat daftar paket yang diinstal lagi.

Chris Wedgwood
sumber
FWIW, saya baru saja mencoba pendekatan ini setelah memutakhirkan ke El Capitan dan menginstal ulang homebrew, dan daftar paket saya tidak terpelihara.
Ryan
1
dengan pipenv Anda dapat menghapus dengan melakukan pipenv --rmdan membuat ulang pipenv shell,,pipenv install
Harry Moreno
14

Ini terjadi ketika saya memperbarui ke Mac OS X Mavericks dari Snow Leopard. Saya juga harus menginstal ulang brew sebelumnya. Semoga Anda menjalankan perintah pembekuan untuk proyek Anda dengan pip.

Untuk menyelesaikannya, Anda harus memperbarui jalur yang ditunjuk oleh lingkungan virtual.

  • Instal versi python dengan minuman:

brew install python

  • Instal ulang virtualenvwrapper.

pip install --upgrade virtualenvwrapper

  • Menghapus lingkungan virtual lama:

rmvirtualenv old_project

  • Buat lingkungan virtual baru:

mkvirtualenv new_project

  • Bekerja pada lingkungan virtual baru

workon new_project

  • Gunakan pip untuk menginstal persyaratan untuk proyek baru.

pip install -r requirements.txt

Ini harus meninggalkan proyek seperti sebelumnya.

Robert Brisita
sumber
Ini beberapa waktu yang lalu dan saya percaya saya akhirnya melakukan sesuatu di sepanjang baris ini, tetapi karena saya belum menjalankan 'pip freeze> requirement.txt' saat itu, itu bukan solusi yang paling efisien. Pelajaran yang dipetik.
oxtay
13

Jawaban versi pembaruan @Chris Wedgwooduntuk menjaga site-packages(menjaga paket diinstal)

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
sumber
1
Ini melampaui kesempurnaan. Membantu memigrasi versi python sambil mempertahankan semua paket. Jika Anda mengikuti ini, jangan jalankan instruksi @Chris Wedgewood.
Harish Prasanna
10

Tampaknya cara yang tepat untuk menyelesaikan masalah ini adalah dengan menjalankannya

 pip install --upgrade virtualenv

setelah Anda memutakhirkan python dengan Homebrew.

Ini harus menjadi prosedur umum untuk setiap rumus yang menginstal sesuatu seperti python, yang memiliki sistem manajemen paket itu sendiri. Ketika Anda menginstal brew install python, Anda menginstal pythondan pipdan easy_installdan virtualenvdan sebagainya. Jadi, jika alat-alat itu dapat diperbarui sendiri, yang terbaik adalah mencoba melakukannya sebelum melihat ke Homebrew sebagai sumber masalah.

Nate
sumber
Ini berfungsi untuk masalah dengan setuptools, khususnya: Peringatan: tidak dapat menemukan lokasi svn untuk setuptools == 0.6c12dev-r88846
Robert Brisita
1
Saya menerapkan solusi ini, diikuti dengan menjalankan: virtualenv . di lingkungan virtual saya yang rusak. Versi yang diperbarui virtualenvkemudian menciptakan kembali dependensi yang diperlukan dan saya bisa melanjutkan. Proses ini lebih dikelola sendiri dan kuat daripada jawaban yang diterima untuk saya.
christang
Pada tahun 2020, ini masih jawabannya.
scubabuddha
7

Jika ini disebabkan oleh brew upgradeupgrade Python-nya, dan Anda setuju dengan penurunan versi ke versi sebelumnya, coba brew switch python [previous version], misalnya brew switch python 3.6.5. Dari sini.

ryan
sumber
4

instruksi virtualenvwrapper

Seperti ditunjukkan dalam jawaban yang diterima, penyebab root kemungkinan adalah pembaruan homebrew yang berarti symlink virtualenv Anda menunjuk pada jalur python yang rusak - lihat detailnya di sini .

Untuk setiap env virtual, Anda perlu menetapkan kembali symlink untuk menunjuk pada jalur python yang benar (di gudang minuman). Inilah cara melakukannya dengan virtualenvwrapper . Di sini saya memperbarui env virtual yang disebut "my-example-env".

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

Semua selesai.

arcseldon
sumber
4

Siapa pun yang menggunakan pipenv (dan Anda harus!) Cukup menggunakan dua perintah ini - tanpa mengaktifkan venv:

rm -rf `pipenv --venv` # remove the broken venv
pipenv install --dev   # reinstall the venv from pipfile 
Robotnik
sumber
1
Anda juga dapat menggunakan pipenv --rmdalam folder env Anda dan kemudianpipenv install --dev
Handfeger
2

Jika Anda telah merusak python3 coba saja brew upgrade python3memperbaikinya untuk saya.

jmoz
sumber
2

Saya baru-baru ini menghadapi ini. Tidak ada solusi di atas yang berfungsi untuk saya. Tampaknya itu sebenarnya bukan masalah Python. Ketika saya sedang menjalankan

aws s3 ls

saya mendapatkan kesalahan berikut:

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

Ini berarti, awsexecutable perpustakaan menunjuk ke arah itu tidak ada atau rusak, jadi saya uninstall dan instal kembali aws-climengikuti instruksi dari tautan ini dan berhasil !!

thekosmix
sumber
2

Masalahnya bagi saya (pengguna MacOS) adalah brewmemperbarui tautan Python dan virtualenvs ke versi lama yang telah dihapus.

Kami dapat memeriksa dan memperbaikinya dengan

>> 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
sumber
Ini juga berfungsi untuk memperbaiki tautan yang rusak setelah menginstal Python 3.7 pada sistem yang menggunakan Python3.6
lukik
2

Saya memiliki masalah serupa dan saya menyelesaikannya dengan hanya membangun kembali lingkungan virtual virtualenv .

dorinjj
sumber
Selamat datang di SO. Meskipun kami berterima kasih atas jawaban Anda, akan lebih baik jika memberikan nilai tambahan di atas jawaban lainnya. Dalam hal ini, jawaban Anda tidak memberikan nilai tambahan, karena pengguna lain sudah memposting solusi itu. Jika jawaban sebelumnya bermanfaat bagi Anda, Anda harus melakukannya memilihnya setelah Anda memiliki reputasi yang
David Buck
1

Menggunakan Python 2.7.10.

Satu perintah virtualenv path-to-envmelakukannya. dokumentasi

$ 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
sumber
1

Saya memiliki env virtual yang rusak karena instal ulang Homebrew dari python (dengan demikian merusak symlink) dan juga beberapa "sudo pip install" yang telah saya lakukan sebelumnya. Kiat Weizhong sangat membantu dalam memperbaiki masalah tanpa harus menginstal ulang paket. Saya juga harus melakukan hal berikut untuk masalah izin campuran.

sudo chown -R my_username lib / python2.7 / paket-situs

P. Gabbur
sumber
Jika Anda melengkapi jawaban pengguna lain, Anda harus meninggalkan komentar untuknya sehingga mereka dapat mengedit! Kontribusi yang bagus.
Francisco Peters
Dia tidak memiliki poin reputasi yang cukup untuk mengomentari jawaban.
Tyler Smith
1

Virtualenvs rusak. Terkadang cara sederhana adalah menghapus folder venv dan membuat ulang virutalenvs.

auraz
sumber
1

Jika Anda menggunakan pipenv, lakukan saja pipenv --rmmenyelesaikan masalah.

sehari-hari
sumber
0

Jawaban yang diterima tidak berfungsi untuk saya: file $WORKON_HOME/*/bin/python2.7tidak lagi symlink, ini adalah executable penuh:

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

Solusinya adalah, sayangnya, untuk sepenuhnya menghapus dan menciptakan kembali dari awal semua lingkungan virtual.

Untuk referensi:

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
sumber
Saya kira itu karena solusi ini tidak usang - saya baru saja mencobanya dan memperbaiki masalah saya. Juga, saya pikir jika Anda tidak memiliki symlink, Anda tidak akan melihat kesalahan yang dijelaskan di sini, jadi komentar ini bukan solusi tetapi gangguan - Hanya karena Anda memiliki versi yang lebih baru, tidak berarti semua orang memilikinya. Itulah dugaan saya mengapa downvote :)
RafazZ
@ RafazZ: Saya harap sekarang lebih baik. Namun, saya bertanya-tanya mengapa itu masih merupakan symlink untuk Anda. Dan ya, saya mendapatkan kesalahan itu karena virtualenv python terhubung dengan stock python libs.
sds
Saya pikir perilaku default masih untuk membuat symlink dan Anda perlu --always-copyargumen untuk menimpanya. Setidaknya itulah yang saya dapatkan dari Panduan Pengguna
RafazZ
@ RafazZ: Saya tidak pernah menggunakan --always-copydan saya memiliki file biasa :-(
sds
0

Cukup memutakhirkan python3 bekerja untuk saya:

brew upgrade python3
Flavio Wuensche
sumber
0

Saya mencoba beberapa metode teratas, tetapi tidak berhasil, bagi saya, yang berusaha membuat racun bekerja. Yang akhirnya berhasil adalah:

sudo pip install tox

bahkan jika racun sudah dipasang. Output diakhiri dengan:

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

Apa yang diperbaiki untuk saya adalah hanya menghapus python3 dan pipenv kemudian menginstalnya kembali.

brew uninstall pipenv
brew uninstall python3
brew install python3 
brew install pipenv
Tuan Nikon
sumber
0

Semua jawabannya hebat di sini, saya mencoba beberapa solusi yang disebutkan di atas oleh Ryan, Chris dan tidak bisa menyelesaikan masalah, jadi harus mengikuti cara yang cepat dan kotor.

  1. rm -rf <project dir>(atau mv <project dir> <backup projct dir>jika Anda ingin menyimpan cadangan)
  2. git clone <project git url>
  3. Berpindah!

Tidak ada yang baru di sini, tapi itu membuat hidup lebih mudah!

rata-rata
sumber
0

Saya yakin saya terlambat ke pesta tetapi saya ingin mengatakan bahwa penyelesaian masalah ini jauh lebih sederhana daripada yang dibahas di sini.

Anda dapat dengan mudah membuat ulang lingkungan virtual tanpa harus menghapus / mengedit apa pun. Dengan asumsi bahwa lingkungan Anda yang rusak disebut, env_to_fixAnda dapat melakukan yang berikut:

mkvirtualenv env_to_fix

Ini akan membuat ulang tautan dan memperbaiki lingkungan tanpa perlu membuang status saat ini di suatu tempat dan memulihkannya.

Fabiano Francesconi
sumber
0

Saya menemukan masalah yang sama ketika saya menunjuk waktu menjalankan python saya dari 2 hingga 3 pada mac saya, menunjuk alias python ke jalur python 3. Saya kemudian membuat ulang virtualenv baru dan menginstal ulang paket-paket yang saya butuhkan untuk proyek saya. Untuk kasus penggunaan saya, saya punya program python menulis ke google sheet. Bersihkan beberapa paket yang berbeda dari implementasi python 2 dan wa la, semuanya mulai bekerja lagi.

black_ray
sumber