Неработающие ссылки в Virtualenvs

Недавно я установил кучу точечных файлов на свой Mac вместе с некоторыми другими приложениями (я перешел на 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

Я удалил все файлы, относящиеся к точечным файлам, и восстановил свой .bash_profile до того, что было раньше, но проблема не устранена. Есть ли способ диагностировать проблему или решить ее простым способом (например, не требовать повторного создания всех виртуальных машин)?


person oxtay    schedule 23.04.2014    source источник
comment
Возможно связанный: debugfix.com/2011/11/dyld-library- загруженный-исполняемый_путь-питон   -  person unutbu    schedule 23.04.2014
comment
Спасибо за комментарий, @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, и все в порядке.   -  person oxtay    schedule 23.04.2014
comment
[обновление] Возможно, я обнаружил проблему, но я не уверен и не знаю, как ее исправить. Кажется, что все команды virtualenv теперь работают теоретически, но, поскольку есть проблема с python, они ничего не делают. Итак, настоящая проблема связана с питоном brew. И у меня есть подозрение, что причина в смене имени в каталогах python. По какой-то причине все эти команды ищут python в папке /usr/local/Cellar/python/2.7.6, но на самом деле имя папки /usr/local/Cellar/python/2.7.6_1.   -  person oxtay    schedule 24.04.2014
comment
Поскольку я новичок, я не знаю, насколько рискованно вручную изменить имя с 2.7.6_1 на 2.7.6 и посмотреть, что произойдет.   -  person oxtay    schedule 24.04.2014
comment
Вы сможете переименовать 2.7.6_1 в 2.7.6. В худшем случае вы можете переименовать его обратно.   -  person unutbu    schedule 24.04.2014
comment
Ага. Я действительно пошел дальше и попробовал. Это заставило меня заметить еще одну проблему. Проблема была не в названии, а скорее в неработающих ссылках, каким-то образом вызванных пивом. Я пробовал кучу вещей, и теперь проблема, похоже, исчезла. Похоже, что сработало, так это удаление Python в homebrew и его повторная установка, а затем запуск brew unlink python && brew link python, а затем brew linkapps. Хотя я думаю, что вторая часть даже не нужна, так как я пробовал ее раньше, но безрезультатно. Спасибо еще раз за помощь!   -  person oxtay    schedule 24.04.2014
comment
К сожалению, битые ссылки у меня не работали. Я смог обойти проблему «плохого интерпретатора» с помощью решения @oxtay, создав новый каталог (mkdir) с именем /usr/local/Cellar/python/2.7.6 и скопировав (cp -r) все файлы из /usr/local/Cellar/python/2.7.9 в эту папку. Я слишком нервничал, чтобы просто переименовать папку!   -  person Patrick Williams    schedule 26.03.2016


Ответы (26)


Я нашел решение проблемы здесь, поэтому вся заслуга принадлежит автору.

Суть в том, что когда вы создаете virtualenv, создается множество символических ссылок на Python, установленный Homebrew.

Вот один пример:

$ 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, который поставляется с OS X.

person Ryan Kaskel    schedule 20.09.2014
comment
+1 gfind был идеальным, так как у меня было много неразбитых символических ссылок (например, nodeenv), которые я не хотел удалять - person 2Toad; 15.03.2016
comment
Другой способ удалить неработающие символические ссылки - использовать стандартный поиск: find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm - person vdboor; 03.01.2017
comment
Я удалил весь свой виртуальный каталог. теперь я не могу удалить символические ссылки. Ни одно из решений, упомянутых на этой странице, не работает для меня на Mac. Я все еще получаю такое же изображение ошибки, которое не найдено. Ловушка прерывания: 6 - person Aseem; 03.07.2018
comment
Эти шаги не совсем сработали для меня: pip3 freeze dyld: lazy symbol binding failed: Symbol not found: __Py_UnixMain - person deed02392; 01.02.2019
comment
Просто чтобы добавить, если env был с Python 2, запустите его с аргументом: virtualenv ~/.virtualenvs/foo -p python2, иначе он будет использовать Python 3. - person Bohumir Zamecnik; 16.04.2019
comment
Большое тебе спасибо. Удаление символических ссылок и воссоздание virtualenv помогло. Отличная работа - person user2233949; 27.09.2019
comment
Большое вам спасибо за этот ответ! Еще одно очень хакерское решение, которое я попробовал, заключалось в том, чтобы отключить brew от обновленной версии Python и переустановить предыдущую версию. - person alannaC; 24.10.2019
comment
Это не сработало для меня, но предложение Роберта Бризиты переустановить virtualenvwrapper сработало. - person Ran Halprin; 09.09.2020

Попробовав несколько вещей, это сработало для меня:

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

cd ~/.virtualenv/name_of_broken_venv

Теперь удалите эти файлы:

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

Затем, чтобы восстановить Venv, запустите:

virtualenv .
workon name_of_broken_venv
pip freeze

Теперь вы должны снова увидеть список установленных пакетов.

person Chris Wedgwood    schedule 30.04.2015
comment
FWIW, я просто попробовал этот подход после обновления до El Capitan и повторной установки homebrew, и мой список пакетов не сохранился. - person Ryan; 15.03.2016
comment
с помощью pipenv вы можете удалить, выполнив pipenv --rm и воссоздать, _2 _, _ 3_ - person Harry Moreno; 13.06.2018
comment
Если вы получите ошибки, связанные с virtualenvwrapper.sh: There was a problem running the initialization hooks, вам нужно будет pip install virtualenv virtualenvwrapper или pip3 install virtualenv virtualenvwrapper, чтобы все снова синхронизировалось. - person cybertoast; 27.08.2020

Это произошло, когда я обновился до Mac OS X Mavericks от Snow Leopard. Мне тоже пришлось заранее переустановить варево. Надеюсь, вы выполнили команду замораживания для своего проекта с помощью pip.

Чтобы решить эту проблему, вам необходимо обновить пути, на которые указывает виртуальная среда.

  • Установите версию 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

Это должно оставить проект таким, каким он был раньше.

person Robert Brisita    schedule 15.08.2014
comment
Это было некоторое время назад, и я считаю, что в конце концов сделал что-то в этом направлении, но, поскольку тогда я не запускал 'pip freeze ›requirements.txt', это было не самое эффективное решение. Урок выучен. - person oxtay; 23.09.2014

Ответ версии обновления @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/
person WeizhongTu    schedule 30.06.2016
comment
Это вне совершенства. Помогает перенести версию Python с сохранением всех пакетов. Если вы следуете этому, не выполняйте инструкции @Chris Wedgewood. - person Harish Prasanna; 09.06.2019

Похоже, правильный способ решить эту проблему - запустить

 pip install --upgrade virtualenv

после того, как вы обновили python с помощью Homebrew.

Это должна быть общая процедура для любой формулы, устанавливающей что-то вроде python, у которого есть собственная система управления пакетами. Когда вы устанавливаете brew install python, вы устанавливаете python и pip, easy_install и virtualenv и так далее. Итак, если эти инструменты можно обновлять самостоятельно, лучше всего попробовать сделать это, прежде чем рассматривать Homebrew как источник проблем.

person Nate    schedule 14.05.2014
comment
Это сработало для проблемы с setuptools, в частности: Предупреждение: не удается найти местоположение svn для setuptools == 0.6c12dev-r88846 - person Robert Brisita; 15.08.2014
comment
Я применил это решение, а затем запустил: virtualenv . в моей сломанной виртуальной среде. Обновленная версия virtualenv затем воссоздала необходимые зависимости, и я был готов к работе. Для меня этот процесс был более управляемым и надежным, чем принятый ответ. - person christang; 25.06.2017
comment
В 2020 году это все еще ответ. - person scubabuddha; 23.04.2020

Если это было вызвано brew upgrade, который обновил свой Python, и вы согласны вернуться к предыдущей версии, попробуйте brew switch python [previous version], например brew switch python 3.6.5. Отсюда.

person ryan    schedule 03.07.2018

инструкции по virtualenvwrapper

Как указано в принятом ответе, основной причиной, вероятно, является обновление homebrew, которое означает, что ваши символические ссылки virtualenv указывают на сломанные пути python - см. Подробности здесь.

Для каждого виртуального env вам необходимо переназначить символические ссылки, чтобы они указывали на правильный путь Python (в погребе). Вот как это сделать с помощью virtualenvwrapper. Здесь я обновляю виртуальный env под названием «my-example-env».

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

Все сделано.

person arcseldon    schedule 10.02.2019

Любой, кто использует pipenv (а вам следует!), Может просто использовать эти две команды - без активация венв:

rm -rf `pipenv --venv` # remove the broken venv
pipenv install --dev   # reinstall the venv from pipfile 
person Robotnik    schedule 15.05.2019
comment
вы также можете использовать pipenv --rm в папке вашего env, а затем pipenv install --dev - person Handfeger; 03.11.2019

Если вы заблокировали python3, просто попробуйте brew upgrade python3, который исправил его для меня.

person jmoz    schedule 13.12.2017

Я недавно с этим столкнулся. Ни одно из вышеперечисленных решений не помогло мне. Похоже, на самом деле это не проблема Python. Когда я запускал

aws s3 ls

, я получал следующую ошибку:

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

Это означает, что исполняемый файл библиотеки aws указывает на либо не они существуют или повреждены, поэтому я удалил и переустановил aws-cli, следуя инструкциям из эту ссылку, и она сработала !!

person thekosmix    schedule 19.09.2018

Проблема для меня (пользователя 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
person Yihe    schedule 22.03.2019
comment
Это также помогло исправить неработающие ссылки после установки Python 3.7 в системе с Python3.6. - person lukik; 20.11.2019

У меня была аналогичная проблема, и я решил ее, просто перестроив виртуальную среду с помощью virtualenv .

person dorinjj    schedule 20.11.2019
comment
Добро пожаловать в SO. Хотя мы благодарим вас за ваш ответ, было бы лучше, если бы он предоставил дополнительную ценность помимо других ответов. В этом случае ваш ответ не дает дополнительной ценности, поскольку другой пользователь уже опубликовал это решение. Если предыдущий ответ был вам полезен, вам следует проголосовать за него, когда у вас будет достаточно репутация - person David Buck; 20.11.2019

Использование 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.
person Ayush Goel    schedule 13.10.2017

У меня был сломанный виртуальный env из-за переустановки Python Homebrew (тем самым сломанные символические ссылки), а также несколько "sudo pip install", которые я сделал ранее. Советы Weizhong очень помогли решить проблемы без переустановки пакетов. Мне также пришлось сделать следующее для проблемы смешанных разрешений.

sudo chown -R имя_пользователя lib / python2.7 / site-packages

person P. Gabbur    schedule 30.05.2019
comment
Если вы дополняете ответы других пользователей, вы должны оставить для них комментарий, чтобы они могли редактировать! Хороший вклад. - person Francisco Peters; 30.05.2019
comment
У него недостаточно очков репутации, чтобы прокомментировать ответ. - person Tyler Smith; 06.06.2019

Виртуальные серверы сломаны. Иногда простой способ - удалить папки venv и воссоздать файлы virutalenvs.

person auraz    schedule 24.09.2019

Если вы используете pipenv, простое выполнение pipenv --rm решает проблему.

person ashdaily    schedule 10.03.2020

Я столкнулся с той же проблемой после обновления brew на OSX Catalina.

Попробовав кучу вещей, я считаю, что следующее - лучшее и простое решение.

Сначала удалите виртуальный env. (По желанию)

find myvirtualenv -type l -delete

затем воссоздайте новый virtualenv

virtualenv myvirtualenv

Ссылка: https://www.jeremycade.com/python/osx/homebrew/2015/03/02/fixing-virtualenv-after-a-python-upgrade/

person Jay Patel    schedule 28.05.2020

Принятый ответ у меня не работает: файл $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
person sds    schedule 11.10.2016
comment
Я думаю, это потому, что это решение не устарело - я только что попробовал его, и моя проблема была решена. Кроме того, я думаю, что если у вас нет символических ссылок, вы не увидите описанную здесь ошибку, поэтому этот комментарий станет не решением, а отвлечением внимания - просто потому, что у вас есть более новая версия, не означает, что все это делают. Это моя догадка, почему я проголосовал против :) - person RafazZ; 27.12.2016
comment
@RafazZ: Надеюсь, теперь лучше. Однако мне интересно, почему это все еще символическая ссылка для вас. И да, я получаю эту ошибку, потому что python virtualenv связан со стандартными библиотеками python. - person sds; 27.12.2016
comment
Я думаю, что по умолчанию по-прежнему создаются символические ссылки, и вам нужен аргумент --always-copy, чтобы переопределить его. По крайней мере, то, что я получил из Руководства пользователя - person RafazZ; 28.12.2016
comment
@RafazZ: Я никогда не использовал --always-copy и у меня есть обычные файлы :-( - person sds; 28.12.2016

У меня сработало простое обновление python3:

brew upgrade python3
person Flavio Wuensche    schedule 17.01.2019

Я попробовал несколько лучших методов, но они не помогли мне, которые пытались заставить работать токсикологию. В конечном итоге сработало:

sudo pip install tox

даже если 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
person Marco    schedule 08.05.2019

Что исправило это для меня, так это просто удаление python3 и pipenv, а затем их переустановка.

brew uninstall pipenv
brew uninstall python3
brew install python3 
brew install pipenv
person Lord Nikon    schedule 05.03.2019

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

  1. rm -rf <project dir> (или mv <project dir> <backup projct dir>, если вы хотите сохранить резервную копию)
  2. git clone <project git url>
  3. Двигаться дальше!

Ничего нового здесь нет, но это облегчает жизнь!

person avp    schedule 15.11.2019

Я уверен, что опаздываю на вечеринку, но хочу сказать, что решение этой проблемы намного проще, чем здесь обсуждается.

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

mkvirtualenv env_to_fix

Это восстановит ссылки и исправит среду без необходимости где-то сбрасывать текущий статус и восстанавливать его.

person Fabiano Francesconi    schedule 28.04.2020

Я столкнулся с той же проблемой, когда указывал время выполнения python с 2 до 3 на моем Mac, указывая псевдоним python на путь python 3. Затем я воссоздаю новый virtualenv и повторно устанавливаю те пакеты, которые мне нужны для моего проекта. Для моего случая использования у меня была программа Python, записывающая в лист Google. Очистите несколько пакетов, которые отличаются от реализации Python 2, и, да, все снова заработало.

person black_ray    schedule 16.05.2020

Итак, есть много способов, но один из них сработал для меня, так как у меня уже был замороженный файл requirements.txt.

Поэтому удалите старую виртуальную среду с помощью следующей команды: deactivate cd .. rm -r old_virtual_environment

чтобы установить пакет virtualenv python с помощью pip, используйте pip install virtualenv

затем проверьте, правильно ли он установлен, используйте virtualenv --version

перейти в каталог вашего проекта, используя cd project_directory

теперь создайте новую виртуальную среду внутри каталога проекта, используя следующее virtualenv name_of_new_virtual_environment

теперь активируйте вновь созданную виртуальную среду, используйте source name_of_new_virtual_environment/bin/activate

теперь установите все зависимости проекта, используя следующую команду: pip install -r requirements.txt

person lordvador    schedule 21.07.2020

Когда вы сталкиваетесь с этой проблемой на только что созданном virtualenv, возможно, ваша версия python, установленная brew, не связана.

Вы можете исправить это, например, запустив: brew link [email protected] (но укажите вашу конкретную версию Python)

Вы также можете запустить brew doctor, он сообщит вам, есть ли у вас несвязанные файлы, и как это исправить.

person Dino Hensen    schedule 04.10.2020