Розбиті посилання у Virtualenvs


238

Нещодавно я встановив на моєму комп’ютері купу точкових файлів разом із деякими іншими програмами (я змінив iTerm замість Terminal та Sublime як мого текстового редактора за замовчуванням), але з тих пір усі мої віртуальні середовища перестали працювати, хоча їх папки всередині .virtualenvs все ще є, і вони дають таку помилку, коли я намагаюся запустити що-небудь у них:

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

Я видалив усі файли, пов’язані з dotfiles, і відновив свій .bash_profile до того, що було раніше, але проблема зберігається. Чи є спосіб діагностувати проблему або вирішити її простим способом (наприклад, не потрібно створювати всі віртуальні знов)?



Дякую за коментар, @unubtu. Це, безумовно, корисно. Але я також не в змозі зробити жодних нових віртуалів. У мене rmvirtualenvвсе ще працює, але при спробі запуску mkvirtualenvя отримую таку помилку: -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 Отже, здається, проблема з моїми шляхами python, але я не можу побачити, де проблема, оскільки я можу запустити python, і це здається нормальним.
оксай

1
[оновлення] Я, можливо, знайшов проблему, але я не впевнений, і я фактично не знаю, як її виправити. Здається, що всі virtualenvкоманди зараз працюють теоретично, але оскільки існує проблема з python, вони нічого не роблять. Тож справжня проблема - з пивом пива. І я маю підозру, що причина - через зміну назви в каталогах python. Чомусь усі ці команди шукають python у папці, /usr/local/Cellar/python/2.7.6але назва папки насправді /usr/local/Cellar/python/2.7.6_1.
оксай

Оскільки я новачок, я не знаю, наскільки ризиковано вручну змінити ім’я з 2.7.6_1 на 2.7.6 і подивитися, що відбувається.
оксай

Ви повинні бути в змозі перейменувати 2.7.6_1в 2.7.6. Якщо гірше дійшло до гіршого, ви можете перейменувати його назад.
unutbu

Відповіді:


369

Я знайшов рішення цієї проблеми тут , так що все заслуга автора.

Суть у тому, що при створенні virtualenv створюється багато посилань на встановлений Homebrew Python.

Ось один із прикладів:

$ 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 за допомогою Homebrew, а потім запускаєте brew cleanup, символьні посилання у virtualenv вказують на шляхи, які більше не існують (оскільки Homebrew їх видалив).

Символьні посилання повинні вказувати на нещодавно встановлений Python:

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

Рішення полягає в тому, щоб видалити символьні посилання у virtualenv, а потім відтворити їх:

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

Напевно, найкраще перевірити, які посилання будуть видалені спочатку перед їх видаленням:

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

На мою думку, ще краще видалити лише зламані символьні посилання. Ви можете зробити це за допомогою GNU find:

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

Ви можете встановити GNU за findдопомогою Homebrew, якщо у вас його ще немає:

brew install findutils

Зауважте, що за замовчуванням програми GNU, встановлені з Homebrew, як правило, мають префікс буквою g. Це дозволяє уникнути затінення findбінарних файлів, що постачаються з ОС X.


4
+1 gfindбуло ідеальним, оскільки у мене було багато неперервних символьних посилань (наприклад, nodeenv), які я не хотів видаляти
2Toad

3
Ще одним способом видалення зламаних посилань є використання стандартного знаходження:find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm
vdboor

Я видалив весь свій virtualenv dir. тепер я не можу видалити посилання. Немає рішень, згаданих на цій сторінці, працюють для мене на Mac. я все одно отримую таку ж помилку "зображення не знайдено. Скасувати пастку: 6"
Aseem

Ці кроки для мене не дуже спрацювали:pip3 freeze dyld: lazy symbol binding failed: Symbol not found: __Py_UnixMain
deed02392

1
Просто додамо, якщо env була з Python 2, запустіть це аргументом: virtualenv ~/.virtualenvs/foo -p python2інакше він буде використовувати Python 3.
Bohumir Zamecnik

41

Спробувавши кілька речей, для мене це спрацювало:

перейдіть у каталог virtualenv (але не запускайте workon):

cd ~/.virtualenv/name_of_broken_venv

Тепер видаліть ці файли:

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

Потім, щоб відновити свій вентиляційний апарат, запустіть:

virtualenv .
workon name_of_broken_venv
pip freeze

Тепер ви знову побачите список встановлених пакетів.


FWIW, я просто спробував такий підхід після оновлення до El Capitan та перевстановлення домашньої мови, і мій список пакетів не зберігся.
Райан

1
з pipenv ви можете видалити, виконавши pipenv --rmі відтворити pipenv shell,pipenv install
Гаррі Moreno

14

Це сталося під час оновлення до Mac OS X Mavericks від Snow Leopard. Довелося заздалегідь встановити заварку. Сподіваємось, ви запустили команду заморожування для вашого проекту з допомогою піп.

Щоб вирішити проблему, вам необхідно оновити шляхи, на які вказує віртуальне середовище.

  • Встановіть версію python з brew:

brew install python

  • Повторно встановіть virtualenvwrapper.

pip install --upgrade virtualenvwrapper

  • Видалено старе віртуальне середовище:

rmvirtualenv old_project

  • Створіть нове віртуальне середовище:

mkvirtualenv new_project

  • Робота над новим віртуальним середовищем

workon new_project

  • Використовуйте pip, щоб встановити вимоги до нового проекту.

pip install -r requirements.txt

Це повинно залишити проект, як це було раніше.


Це було деякий час тому, і я вважаю, що в кінцевому підсумку я щось зробив за цими напрямками, але оскільки я тоді не працював над "pip freeze> требованиями.txt", це було не найефективнішим рішенням. Заняття.
оксай

13

Відповідь оновленої версії @Chris Wedgwoodна збереження site-packages(зберігання встановлених пакетів)

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
Це поза досконалістю. Допомагає мігрувати версію python, зберігаючи всі пакунки. Якщо ви дотримуєтесь цього, не виконуйте вказівки @Chris Wedgewood.
Харіш Прасанна

10

Здається, запустити правильний спосіб вирішити цю проблему

 pip install --upgrade virtualenv

після того як ви оновили python до програми Homebrew.

Це має бути загальною процедурою для будь-якої формули, яка встановлює щось на зразок python, у якому є власна система управління пакетами. При установці brew install python, установка pythonі pipта easy_installі virtualenvта так далі. Отже, якщо ці інструменти можна оновити самостійно, найкраще спробувати це зробити, перш ніж шукати Homebrew як джерело проблем.


Це спрацювало з проблемою з setuptools, зокрема: Увага: не вдалося знайти svn місця для setuptools == 0.6c12dev-r88846
Robert Brisita

1
Я застосував це рішення з подальшим запуском: virtualenv . у моєму розбитому віртуальному середовищі. Тоді оновлена ​​версія virtualenvвідтворила необхідні залежності, і мені було добре піти. Цей процес був більш самокерованим і надійним, ніж прийнята для мене відповідь.
christang

У 2020 році це все ще є відповіддю.
scubabuddha

7

Якщо це було викликано тим, brew upgradeщо оновлено його Python, і ви все в порядку з переходом на попередню версію, спробуйте brew switch python [previous version], наприклад brew switch python 3.6.5. Звідси.


4

інструкції щодо virtualenvwrapper

Як зазначено у прийнятій відповіді, першопричиною, ймовірно, є оновлення домашньої версії, що означає, що ваші virtualenv символьні посилання вказують на порушені шляхи python - детальну інформацію тут .

Для кожної віртуальної env вам потрібно перепризначити символьні посилання, щоб вказати на правильний шлях python (у підварі для пивоваріння). Ось як це зробити за допомогою virtualenvwrapper . Тут я оновлюю віртуальну env під назвою "my-example-env".

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

Готово.


4

Кожен, хто використовує pipenv (і вам слід!), Може просто використовувати ці дві команди - не активуючи venv:

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

1
ви також можете використовувати pipenv --rmв папці свого env, а потімpipenv install --dev
Handfeger

2

Якщо ви зламали python3, просто спробуйте brew upgrade python3це виправити.


2

Нещодавно я стикався з цим. Жодне з перерахованих вище рішень не працювало для мене. Здається, це насправді не проблема Python. Під час запуску

aws s3 ls

я отримував наступну помилку:

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

Це означає, що awsвиконуваний файл бібліотеки вказує на те, що він або не існує, або пошкоджений, тому я видалив та перевстановив, aws-cliвиконуючи інструкції з цього посилання, і він працював !!


2

Проблема для мене (користувача MacOS) полягає в тому, що brewоновлено посилання Python і virtualenvs на стару версію, яку було видалено.

Ми можемо перевірити і виправити це

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

Це також працювало на виправлення зламаних посилань після встановлення Python 3.7 в системі, яка мала Python3.6
lukik

2

У мене була подібна проблема, і я вирішив її, просто відновивши віртуальне середовище virtualenv .


Ласкаво просимо до SO. Хоча ми дякуємо вам за вашу відповідь, було б краще, якби вона надала додаткову цінність поверх інших відповідей. У цьому випадку ваша відповідь не надає додаткового значення, оскільки інший користувач вже розмістив це рішення. Якщо попередня відповідь була для вас корисною, ви повинні проголосувати за неї, коли у вас буде достатня репутація
Девід Бак

1

Використання Python 2.7.10.

Одна команда virtualenv path-to-envце робить. документація

$ 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

У мене була зламана віртуальна середовище через перевстановлення Homebrew python (таким чином, зламані символьні посилання), а також кілька "sudo pip install", які я робив раніше. Поради Weizhong були дуже корисними для вирішення проблем, не потребуючи перевстановлення пакетів. Я також повинен був зробити наступне для змішаної проблеми дозволів.

sudo chown -R my_username lib / python2.7 / site-пакети


Якщо ви доповнюєте відповіді іншого користувача, ви повинні залишити коментар до них, щоб вони могли редагувати! Приємний внесок.
Франциско Пітерс

У нього недостатньо балів репутації, щоб прокоментувати відповідь.
Тайлер Сміт

1

Віртуальні розбиті. Іноді простим способом є видалення венв-папок і відтворення virutalenvs.



1

Я зіткнувся з тим же питанням після оновлення варіння на моєму OSX Catalina.

Спробувавши купу продуктів, я знаходжу наступне - найкраще і просте рішення.

Спочатку видаліть віртуальне оточення. (Необов’язково)

find myvirtualenv -type l -delete

потім відтворити новий віртуаленв

virtualenv myvirtualenv

Довідка: https://www.jeremycade.com/python/osx/homebrew/2015/03/02/fixing-virtualenv-after-a-python-upgrade/


0

Прийнята відповідь для мене не працює: файл $WORKON_HOME/*/bin/python2.7більше не є посиланням, це повноцінний виконуваний файл:

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

На жаль, рішення полягає в тому, щоб повністю видалити та створити з нуля всі віртуальні середовища.

Довідково:

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

Я думаю, це тому, що це рішення не застаріло - я тільки що спробував це, і це вирішило мою проблему. Крім того, я думаю, якщо у вас немає посилань, ви не побачите описаної тут помилки, тож цей коментар стає не рішенням, а відволіканням уваги. Тільки тому, що у вас є новіша версія, це не означає, що всі. Ось я здогадуюсь, чому сутінка :)
RafazZ

@RafazZ: Я сподіваюся, що зараз краще. Однак мені цікаво, чому це все-таки для вас символічне посилання. І так, я отримую цю помилку, тому що virtualenv python пов'язаний з білками python.
sds

Я думаю, що поведінка за замовчуванням все-таки створює посилання, і вам потрібен --always-copyаргумент, щоб перекрити це. Принаймні те, що я отримав з Посібника користувача
RafazZ

@RafazZ: Я ніколи не користувався --always-copyі маю регулярні файли :-(
sds


0

Я спробував кілька кращих методів, але вони не спрацювали для мене, які намагалися зробити таксичну роботу. Що в підсумку спрацювало:

sudo pip install tox

навіть якщо токсик вже був встановлений. Вихід закінчується:

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

Що для мене виправлено - це просто видалення python3 та pipenv, а потім їх перевстановлення.

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

0

Усі відповіді тут чудові, я спробував пару рішень, згаданих вище Райаном, Крісом, і не зміг вирішити проблему, тому довелося дотримуватися швидкого і брудного шляху.

  1. rm -rf <project dir>(або mv <project dir> <backup projct dir>якщо ви хочете зберегти резервну копію)
  2. git clone <project git url>
  3. Рухайся!

Тут нічого роману, але це полегшує життя!


0

Я впевнений, що я спізнююся з партією, але хочу сказати, що вирішення цієї проблеми набагато простіше, ніж тут обговорювалося.

Ви можете легко відновити віртуальне середовище, не потребуючи нічого видаляти / редагувати. Якщо припустити, що ваше порушене середовище викликається, env_to_fixви можете просто виконати таке:

mkvirtualenv env_to_fix

Це відновить посилання та виправить оточення без необхідності скидати поточний стан десь і відновити його.


0

Я зіткнувся з тією ж проблемою, коли я вказував мій час роботи пітона від 2 до 3 на моєму mac, вказуючи псевдонім python на python 3 шлях. Потім я відтворюю новий virtualenv і знову встановлюю ті пакунки, які мені потрібні для мого проекту. Для мого використання я мав програму python, що пише на лист Google. Очистіть декілька пакетів, які відрізняються від реалізації python 2 та wa la, все почало працювати знову.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.