Tài liệu tham khảo bị hỏng trong Virtualenvs


238

Gần đây tôi đã cài đặt một loạt các dotfiles trên máy Mac của mình cùng với một số ứng dụng khác (tôi đã đổi thành iTerm thay vì Terminal và Sublime làm trình soạn thảo văn bản mặc định của tôi) nhưng kể từ đó, tất cả các môi trường ảo của tôi đã ngừng hoạt động, mặc dù các thư mục của chúng bên trong .virtualenvs vẫn còn đó và họ đưa ra lỗi sau mỗi khi tôi cố chạy bất cứ thứ gì trong đó:

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

Tôi đã xóa tất cả các tệp liên quan đến dotfiles và đã khôi phục .bash_profile của tôi về những gì trước đây, nhưng vấn đề vẫn tồn tại. Có cách nào để chẩn đoán vấn đề hoặc giải quyết vấn đề một cách dễ dàng (ví dụ: không yêu cầu tạo lại tất cả các virtualenvs nữa không)?


1
Có thể liên quan: debugfix.com/2011/11/dyld-l Library
loaded

Cảm ơn bạn đã bình luận, @unubtu. Điều này chắc chắn là hữu ích. Nhưng tôi cũng không thể tạo ra bất kỳ virtualenv mới nào. Tôi rmvirtualenvvẫn hoạt động nhưng khi cố chạy mkvirtualenv, tôi gặp lỗi sau: -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 Vì vậy, có vẻ như có vấn đề với đường dẫn python của tôi nhưng tôi không thể thấy vấn đề ở đâu, vì tôi có thể chạy python và nó có vẻ ổn.
oxtay

1
[cập nhật] Tôi có thể đã tìm thấy vấn đề nhưng tôi không chắc chắn và tôi thực sự không chắc chắn cách khắc phục. Có vẻ như tất cả virtualenvcác lệnh hiện đang hoạt động trên lý thuyết, nhưng vì có vấn đề với python, nên chúng không làm gì cả. Vì vậy, vấn đề thực sự là với trăn bia. Và tôi có một nghi ngờ rằng lý do là vì một sự thay đổi tên trong các thư mục python. Vì một số lý do, tất cả các lệnh này đang tìm kiếm python trong thư mục /usr/local/Cellar/python/2.7.6nhưng thực tế tên của thư mục /usr/local/Cellar/python/2.7.6_1.
oxtay

Vì tôi là người mới, tôi không biết việc thay đổi tên thủ công từ 2.7.6_1 thành 2.7.6 sẽ nguy hiểm như thế nào và xem điều gì sẽ xảy ra.
oxtay

Bạn sẽ có thể đổi tên 2.7.6_1thành 2.7.6. Nếu tệ hơn đến tồi tệ nhất, bạn có thể đổi tên nó trở lại.
unutbu

Câu trả lời:


369

Tôi tìm thấy giải pháp cho vấn đề ở đây , vì vậy tất cả tín dụng đều thuộc về tác giả.

Điểm chính là khi bạn tạo một virtualenv, nhiều liên kết tượng trưng được tạo ra cho Python đã cài đặt Homebrew.

Đây là một ví dụ:

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

Khi bạn nâng cấp Python bằng Homebrew và sau đó chạy brew cleanup, các liên kết tượng trưng trong virtualenv trỏ đến các đường dẫn không còn tồn tại (vì Homebrew đã xóa chúng).

Các liên kết tượng trưng cần trỏ đến Python mới được cài đặt:

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

Giải pháp là loại bỏ các liên kết tượng trưng trong virtualenv và sau đó tạo lại chúng:

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

Có lẽ tốt nhất để kiểm tra những liên kết nào sẽ bị xóa trước khi xóa chúng:

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

Theo tôi, tốt hơn hết là chỉ xóa các liên kết bị hỏng. Bạn có thể làm điều này bằng GNU find:

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

Bạn có thể cài đặt GNU findvới Homebrew nếu bạn chưa có nó:

brew install findutils

Lưu ý rằng theo mặc định, các chương trình GNU được cài đặt với Homebrew có xu hướng được thêm tiền tố vào chữ cái g. Điều này là để tránh bóng mờ findnhị phân đi kèm với OS X.


4
1 gfindlà hoàn hảo, vì tôi đã có rất nhiều liên kết tượng trưng không gián đoạn (ví dụ, nodeenv) mà tôi không muốn xóa
2Toad

3
Một cách khác để loại bỏ các liên kết bị hỏng là sử dụng công cụ tìm tiêu chuẩn:find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm
vdboor

Tôi đã xóa toàn bộ dir Virtualenv của tôi. bây giờ tôi không thể loại bỏ symlink. Không phải các giải pháp được đề cập trên trang này làm việc cho tôi trên mac. tôi vẫn nhận được lỗi tương tự "không tìm thấy hình ảnh. Hủy bỏ bẫy: 6"
Aseem

Các bước này không hiệu quả lắm đối với tôi:pip3 freeze dyld: lazy symbol binding failed: Symbol not found: __Py_UnixMain
deed02392

1
Chỉ cần thêm, nếu env là với Python 2, hãy chạy nó với đối số: virtualenv ~/.virtualenvs/foo -p python2nếu không, nó sẽ sử dụng Python 3.
Bohumir Zamecnik

41

Sau khi thử một vài thứ, điều này làm việc cho tôi:

đi tới thư mục virtualenv của bạn (nhưng không chạy workon):

cd ~/.virtualenv/name_of_broken_venv

Bây giờ xóa các tập tin này:

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

Sau đó, để xây dựng lại venv của bạn, chạy:

virtualenv .
workon name_of_broken_venv
pip freeze

Bây giờ bạn sẽ thấy một danh sách các gói đã cài đặt của bạn một lần nữa.


FWIW, tôi vừa thử phương pháp này sau khi nâng cấp lên El Capitan và cài đặt lại homebrew, và danh sách gói của tôi không được giữ nguyên.
Ryan

1
với pipenv bạn có thể loại bỏ bằng cách thực hiện pipenv --rmvà tạo lại pipenv shell,pipenv install
Harry Moreno

14

Điều này xảy ra khi tôi cập nhật lên Mac OS X Mavericks từ Snow Leopard. Tôi cũng phải cài đặt lại brew trước đó. Hy vọng rằng bạn đã chạy lệnh đóng băng cho dự án của bạn với pip.

Để giải quyết, bạn phải cập nhật các đường dẫn mà môi trường ảo trỏ tới.

  • Cài đặt phiên bản python với brew:

brew install python

  • Cài đặt lại virtualenvwrapper.

pip install --upgrade virtualenvwrapper

  • Đã xóa môi trường ảo cũ:

rmvirtualenv old_project

  • Tạo một môi trường ảo mới:

mkvirtualenv new_project

  • Làm việc trên môi trường ảo mới

workon new_project

  • Sử dụng pip để cài đặt các yêu cầu cho dự án mới.

pip install -r requirements.txt

Điều này sẽ rời khỏi dự án như trước đây.


Cách đây một thời gian và tôi tin rằng cuối cùng tôi đã làm được điều gì đó dọc theo những dòng này, nhưng vì tôi đã không chạy 'pip freeze> terms.txt', nên đó không phải là giải pháp hiệu quả nhất. Bài học kinh nghiệm.
oxtay

13

@Chris WedgwoodCâu trả lời của phiên bản cập nhật để giữ site-packages(giữ các gói được cài đặt)

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
Điều này là vượt quá sự hoàn hảo. Giúp di chuyển phiên bản python trong khi giữ lại tất cả các gói. Nếu bạn đang theo dõi điều này, đừng thực hiện hướng dẫn của @Chris Wedgewood.
Harish Prasanna

10

Có vẻ như cách thích hợp để giải quyết vấn đề này là chạy

 pip install --upgrade virtualenv

sau khi bạn đã nâng cấp python với Homebrew.

Đây phải là một quy trình chung cho bất kỳ công thức nào cài đặt một cái gì đó như python, có hệ thống quản lý gói riêng. Khi bạn cài đặt brew install python, bạn cài đặt pythonpipeasy_installvirtualenvvà vân vân. Vì vậy, nếu những công cụ đó có thể tự cập nhật, tốt nhất bạn nên thử làm điều đó trước khi xem Homebrew là nguồn gốc của các vấn đề.


Điều này đã làm việc với một vấn đề với setuptools, cụ thể: Cảnh báo: không thể tìm thấy vị trí svn cho setuptools == 0.6c12dev-r88846
Robert Brisita

1
Tôi đã áp dụng giải pháp này, tiếp theo là chạy: virtualenv . trong môi trường ảo bị hỏng của tôi. Phiên bản cập nhật virtualenvsau đó đã tạo lại các phụ thuộc cần thiết và tôi đã sẵn sàng để đi. Quá trình này tự quản lý và mạnh mẽ hơn câu trả lời được chấp nhận cho tôi.
christang

Năm 2020, đây vẫn là câu trả lời.
scubabuddha

7

Nếu điều này là do một bản brew upgradenâng cấp Python của nó gây ra và bạn vẫn ổn với việc hạ cấp xuống phiên bản trước, hãy thử brew switch python [previous version], vd brew switch python 3.6.5. Từ đây.


4

hướng dẫn virtualenvwrapper

Như đã chỉ ra trong câu trả lời được chấp nhận, nguyên nhân gốc có khả năng là một bản cập nhật homebrew có nghĩa là các liên kết ảo của bạn đang chỉ vào các đường dẫn python bị hỏng - xem chi tiết tại đây .

Đối với mỗi env ảo, bạn cần gán lại các liên kết tượng trưng để trỏ đến đường dẫn python chính xác (trong hầm bia). Đây là cách thực hiện với virtualenvwrapper . Ở đây tôi đang cập nhật một env ảo có tên là "my-example-env".

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

Tất cả đã được làm xong.


4

Bất cứ ai đang sử dụng pipenv (và bạn nên!) Chỉ có thể sử dụng hai lệnh này - mà không cần kích hoạt venv:

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

1
bạn cũng có thể sử dụng pipenv --rmtrong thư mục env của mình và sau đópipenv install --dev
Handfeger

2

Nếu bạn đã mua python3, hãy thử brew upgrade python3nó cho tôi.


2

Gần đây tôi đã phải đối mặt với điều này. Không có giải pháp nào ở trên làm việc cho tôi. Có vẻ như đó không phải là vấn đề của Python. Khi tôi đang chạy,

aws s3 ls

tôi gặp phải lỗi sau:

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

Điều này có nghĩa là, thư viện awsthực thi đang hướng tới là không tồn tại hoặc bị hỏng, do đó tôi đã gỡ cài đặt và cài đặt lại aws-clitheo hướng dẫn từ liên kết này và nó đã hoạt động !!


2

Vấn đề đối với tôi (một người dùng MacOS) là đã brewcập nhật các liên kết Python và virtualenvs lên phiên bản cũ đã bị xóa.

Chúng tôi có thể kiểm tra và sửa chữa nó bằng cách

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

Điều này cũng hoạt động để sửa các liên kết bị hỏng sau khi cài đặt Python 3.7 trên hệ thống có Python3.6
lukik

2

Tôi đã có một vấn đề tương tự và tôi đã giải quyết nó bằng cách xây dựng lại môi trường ảo với virtualenv .


Chào mừng đến với SO. Mặc dù chúng tôi cảm ơn bạn vì câu trả lời của bạn, nhưng sẽ tốt hơn nếu nó cung cấp giá trị bổ sung trên đầu các câu trả lời khác. Trong trường hợp này, câu trả lời của bạn không cung cấp giá trị bổ sung, vì một người dùng khác đã đăng giải pháp đó. Nếu câu trả lời trước đó hữu ích cho bạn, bạn nên bỏ phiếu khi bạn có đủ danh tiếng
David Buck

1

Sử dụng Python 2.7.10.

Một lệnh duy nhất virtualenv path-to-envlàm điều đó. tài liệu

$ 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

Tôi đã bị hỏng env ảo do cài đặt lại Homebrew của python (do đó các symlink bị hỏng) và một vài "sudo pip install" tôi đã thực hiện trước đó. Các mẹo của Weizhong rất hữu ích trong việc khắc phục sự cố mà không phải cài đặt lại các gói. Tôi cũng đã phải làm như sau cho vấn đề quyền hỗn hợp.

sudo chown -R my_username lib / python2.7 / gói trang web


Nếu bạn đang bổ sung câu trả lời của người dùng khác, bạn nên để lại nhận xét cho họ để họ có thể chỉnh sửa! Đóng góp tốt đẹp.
Francisco Peters

Anh ta không có đủ điểm danh tiếng để bình luận về một câu trả lời.
Tyler Smith

1

Virtualenvs bị hỏng. Đôi khi cách đơn giản là xóa các thư mục venv và tạo lại virutalenvs.


1

Nếu bạn sử dụng pipenv, chỉ cần pipenv --rmgiải quyết vấn đề.


1

Tôi đã phải đối mặt với vấn đề tương tự sau khi nâng cấp bia trên OSX Catalina của tôi.

Sau khi thử một loạt các thứ, tôi thấy sau đây là giải pháp tốt nhất và dễ dàng.

Lúc đầu, xóa env ảo. (Không bắt buộc)

find myvirtualenv -type l -delete

sau đó tạo lại một virtualenv mới

virtualenv myvirtualenv

Tham khảo: https://www.jeremycade.com/python/osx/homebrew/2015/03/02/fixing-virtualenv-after-a-python-upTHER/


0

Câu trả lời được chấp nhận không hoạt động đối với tôi: tệp $WORKON_HOME/*/bin/python2.7không còn là liên kết tượng trưng, ​​nó là tệp thực thi chính thức:

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

Giải pháp là, than ôi, để loại bỏ hoàn toàn và tạo lại từ đầu tất cả các môi trường ảo.

Để tham khảo:

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

Tôi đoán đó là vì giải pháp này không lỗi thời - tôi vừa thử nó và nó đã khắc phục vấn đề của tôi. Ngoài ra, tôi nghĩ rằng nếu bạn không có liên kết tượng trưng, ​​bạn sẽ không thấy lỗi được mô tả ở đây, vì vậy nhận xét này không phải là giải pháp mà là sự phân tâm - Chỉ vì bạn có phiên bản mới hơn, không có nghĩa là mọi người đều mắc phải. Đó là suy đoán của tôi tại sao downvote :)
RafazZ

@RafazZ: Tôi hy vọng nó bây giờ tốt hơn. Tuy nhiên, tôi tự hỏi tại sao nó vẫn là một liên kết tượng trưng cho bạn. Và vâng, tôi nhận được lỗi đó vì python virtualenv được liên kết với libs python stock.
sds

Tôi nghĩ rằng hành vi mặc định vẫn là tạo liên kết tượng trưng và bạn cần một --always-copyđối số để ghi đè lên nó. Ít nhất đó là những gì tôi nhận được từ Hướng dẫn sử dụng
RafazZ

@RafazZ: Tôi chưa bao giờ sử dụng --always-copyvà tôi có các tệp thông thường :-(
sds

0

Đơn giản chỉ cần nâng cấp python3 đã làm việc cho tôi:

brew upgrade python3

0

Tôi đã thử một vài phương pháp hàng đầu, nhưng chúng không hiệu quả, đối với tôi, chúng đang cố gắng làm cho độc tố hoạt động. Điều cuối cùng đã làm việc là:

sudo pip install tox

ngay cả khi độc tố đã được cài đặt. Đầu ra kết thúc bằng:

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

Điều sửa lỗi cho tôi chỉ là gỡ cài đặt python3 và pipenv sau đó cài đặt lại chúng.

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

0

Tất cả các câu trả lời đều rất hay ở đây, tôi đã thử một vài giải pháp được đề cập ở trên bởi Ryan, Chris và không thể giải quyết vấn đề, vì vậy phải làm theo một cách nhanh chóng và bẩn thỉu.

  1. rm -rf <project dir>(hoặc mv <project dir> <backup projct dir>nếu bạn muốn giữ một bản sao lưu)
  2. git clone <project git url>
  3. Tiến lên!

Không có gì mới lạ ở đây, nhưng nó làm cho cuộc sống dễ dàng hơn!


0

Tôi chắc chắn rằng tôi đến bữa tiệc muộn nhưng tôi muốn nói rằng việc giải quyết vấn đề này đơn giản hơn nhiều so với thảo luận ở đây.

Bạn có thể dễ dàng tạo lại môi trường ảo mà không phải xóa / chỉnh sửa bất cứ thứ gì. Giả sử rằng môi trường bị hỏng của bạn được gọi là env_to_fixbạn có thể làm như sau:

mkvirtualenv env_to_fix

Điều này sẽ tạo lại các liên kết và sửa chữa môi trường mà không cần phải đổ trạng thái hiện tại ở đâu đó và khôi phục nó.


0

Tôi đã gặp một vấn đề tương tự khi tôi chỉ thời gian chạy trăn của tôi từ 2 đến 3 trên máy mac của tôi, chỉ con trăn bí danh cho con đường 3 con trăn. Sau đó tôi tạo lại một virtualenv mới và cài đặt lại các gói tôi cần cho dự án của mình. Đối với trường hợp sử dụng của tôi, tôi đã có một chương trình python viết lên google sheet. Dọn dẹp một vài gói khác với triển khai python 2 và wa la, mọi thứ bắt đầu hoạt động trở lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.