Нерабочие ссылки в 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
, он сообщит вам, есть ли у вас несвязанные файлы, и как это исправить.
Здесь все ответы отличные, я попробовал несколько решений, упомянутых выше Райаном, Крисом, и не смог решить проблему, поэтому пришлось следовать быстрым и грязным путем.
rm -rf <project dir>
(илиmv <project dir> <backup projct dir>
если вы хотите сохранить резервную копию)git clone <project git url>
- Двигаться дальше!
Здесь нет ничего нового, но это облегчает жизнь!
Я столкнулся с той же проблемой, когда указывал время выполнения python с 2 до 3 на моем Mac, указывая псевдоним python на путь python 3. Затем я воссоздаю новый virtualenv и повторно устанавливаю те пакеты, которые мне нужны для моего проекта. Для моего случая использования у меня была программа Python, записывающая в лист Google. Очистите несколько пакетов, которые отличаются от реализации Python 2, и, да, все снова заработало.
Итак, есть много способов, но один из них, который сработал для меня, заключается в следующем, поскольку у меня уже был заморожен файл 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
Я уверен, что опаздываю на вечеринку, но хочу сказать, что решение этой проблемы намного проще, чем здесь обсуждается.
Вы можете легко восстановить виртуальную среду, не удаляя / редактируя ничего. Предполагая, что ваша испорченная среда называетсяenv_to_fix
вы можете просто сделать следующее:
mkvirtualenv env_to_fix
Это восстановит связи и исправит среду без необходимости где-то сбрасывать текущий статус и восстанавливать его.