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

239

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

oxtay
источник
1
Возможно связано: debugfix.com/2011/11/dyld-library-loaded-executable_path-python
unutbu
Спасибо за комментарий, @unubtu. Это, безусловно, полезно. Но я также не в состоянии сделать какие-либо новые virtualenvs. Мой 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команды сейчас работают теоретически, но, поскольку есть проблема с питоном, они ничего не делают. Так что настоящая проблема с питоном brew. И у меня есть подозрение, что причина кроется в изменении имени в каталогах 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

Ответы:

370

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

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

Райан Каскель
источник
4
+1 gfindбыл идеальным, так как у меня было много неразбитых символических ссылок (например, nodeenv), которые я не хотел удалять
2Toad
3
Другой способ удалить неработающие символические ссылки - использовать стандартную команду find:find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm
vdboor
Я удалил весь мой каталог virtualenv. Теперь я не могу удалить символические ссылки. Ни одно из решений, упомянутых на этой странице, не работает для меня на 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.
Богумир
41

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

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

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

Крис Веджвуд
источник
FWIW, я только что попробовал этот подход после обновления до El Capitan и переустановки homebrew, и мой список пакетов не сохранился.
Райан
1
с pipenv вы можете удалить, выполнив pipenv --rmи воссоздав pipenv shell,pipenv install
Гарри Морено
14

Это произошло, когда я обновился до 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

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

Роберт Брисита
источник
Это было некоторое время назад, и я полагаю, что в конце концов сделал что-то в этом роде, но поскольку я тогда не запускал pip freeze> needs.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/
WeizhongTu
источник
1
Это за гранью совершенства. Помогает перенести версию Python, сохраняя все пакеты. Если вы следуете этому, не выполняйте инструкции @Chris Wedgewood.
Хариш Прасанна
10

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

 pip install --upgrade virtualenv

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

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

Nate
источник
Это сработало для проблемы с setuptools, а именно: Предупреждение: не удается найти svn-расположение для setuptools == 0.6c12dev-r88846
Роберт Брисита,
1
Я применил это решение, а затем запустил: virtualenv . в моей сломанной виртуальной среде. Обновленная версия virtualenvзатем воссоздала необходимые зависимости, и я был в порядке. Этот процесс был более самоуправляемым и надежным, чем принятый для меня ответ.
Христанг
В 2020 году это все еще ответ.
scubabuddha
7

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

Райана
источник
4

инструкции virtualenvwrapper

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

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

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

Все сделано.

arcseldon
источник
4

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

rm -rf `pipenv --venv` # remove the broken venv
pipenv install --dev   # reinstall the venv from pipfile 
Robotnik
источник
1
вы также можете использовать pipenv --rmв папке вашего env, а затемpipenv install --dev
Handfeger
2

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

jmoz
источник
2

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

aws s3 ls

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

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

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

thekosmix
источник
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
Yihe
источник
Это также сработало для исправления неработающих ссылок после установки Python 3.7 в системе, в которой был Python3.6
lukik
2

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

dorinjj
источник
Добро пожаловать в ТАК. Несмотря на то, что мы благодарим вас за ваш ответ, было бы лучше, если бы он предоставил дополнительную ценность поверх других ответов. В этом случае ваш ответ не дает дополнительной ценности, поскольку другой пользователь уже опубликовал это решение. Если предыдущий ответ был вам полезен, вы должны проголосовать за него, как только у вас будет достаточно репутации
Дэвид Бак
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

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

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

П. Габбур
источник
Если вы дополняете ответы других пользователей, вы должны оставить для них комментарий, чтобы они могли редактировать! Хороший вклад.
Франциско Питерс
У него недостаточно очков репутации, чтобы комментировать ответ.
Тайлер Смит
1

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

auraz
источник
1

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

ashdaily
источник
1

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

Джей Патель
источник
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: Я надеюсь, что теперь лучше. Однако мне интересно, почему это все еще символическая ссылка для вас. И да, я получаю эту ошибку, потому что python virtualenv связан с библиотеками стандартных питонов.
SDS
Я думаю, что поведение по умолчанию по-прежнему заключается в создании символических ссылок, и вам нужен --always-copyаргумент для его переопределения. По крайней мере, то, что я получил из Руководства пользователя
RafazZ
@RafazZ: я никогда не использовал, --always-copyи у меня есть обычные файлы :-(
sds
0

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

brew upgrade python3
Флавио Вуенше
источник
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
Marco
источник
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. Двигаться дальше!

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

AVP
источник
0

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

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

mkvirtualenv env_to_fix

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

Фабиано Франческони
источник
0

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

black_ray
источник