Подтвердить что ты не робот

Сломанные ссылки в Virtualenvs

Недавно я установил кучу dotfiles на моем 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

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

4b9b3361

Ответ 1

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

Суть в том, что при создании 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, который поставляется с OS X.

Ответ 2

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

перейдите в каталог 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

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

Ответ 3

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

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

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

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

Ответ 4

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

 pip install --upgrade virtualenv

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

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

Ответ 5

Версия обновления @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/

Ответ 6

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

Ответ 7

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

Ответ 8

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

aws s3 ls

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

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

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

Ответ 9

инструкции virtualenvwrapper

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

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

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

Все сделано.

Ответ 10

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

Ответ 11

Проблема для меня (пользователя 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

Ответ 12

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

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

Ответ 13

Принятый ответ не работает для меня: файл $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

Ответ 14

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

brew upgrade python3

Ответ 15

Для меня это было просто удалить python3 и pipenv, а затем переустановить их.

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

Ответ 16

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

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

Ответ 17

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

sudo chown -R my_username lib/python2.7/site-packages

Ответ 18

Virtualenvs сломаны. Иногда простым способом является удаление папок venv и воссоздание virutalenvs.