Нерабочие ссылки в 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 до того, что было раньше, но проблема не устранена. Есть ли способ диагностировать проблему или решить ее простым способом (например, не нужно создавать все virtualenv заново)?

10 ответов

Решение

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

Суть в том, что когда вы создаете 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.

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

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

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

Это произошло, когда я обновился до Mac OS X Mavericks от Snow Leopard. Мне тоже пришлось переустанавливать варево заранее. Надеюсь, вы запустили команду freeze для вашего проекта с помощью 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

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

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

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

 pip install --upgrade virtualenv

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

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

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

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

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

инструкции virtualenvwrapper

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

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

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

Все сделано.

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

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

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

aws s3 ls

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

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

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

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

Я столкнулся с той же проблемой после обновления 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/

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

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

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

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

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

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

brew upgrade python3

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

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

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

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

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

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

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

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

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

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

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

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

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

Поэтому удалите старую виртуальную среду с помощью следующей команды:deactivatecd ..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

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

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

mkvirtualenv env_to_fix

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

Другие вопросы по тегам