Virtualenv python сломался после обновления ubuntu с 15.10 по 16.04
У меня был python 3.4 в моем virtualenv, но после обновления ubuntu до 16.04 python обновлен до 3.5, поэтому python в virtualenv сбрасывается с этими ошибками:
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
Current thread 0x00007f2f2dbcb700 (most recent call first):
fish: "python" terminated by signal SIGABRT (Abort)
Как я могу это исправить?
Ответы
Ответ 1
Я исправил это, установив минимальный рабочий python3.4, чтобы мой virtualenv работал достаточно хорошо, чтобы получить список пакетов, а затем создал новый с python3.5... следующим образом:
Получить минимальные пакеты python3.4:
wget http://launchpadlibrarian.net/221250032/python3.4-minimal_3.4.3-1ubuntu1~14.04.3_amd64.deb
wget http://launchpadlibrarian.net/221250033/libpython3.4-minimal_3.4.3-1ubuntu1~14.04.3_amd64.deb
sudo dpkg -i --force-breaks libpython3.4-minimal_3.4.3-1ubuntu1~14.04.3_amd64.deb
sudo dpkg -i python3.4-minimal_3.4.3-1ubuntu1~14.04.3_amd64.deb
Мой virtualenv находится здесь: ~/virtualenv/example
Получить список пакетов в вашем virtualenv (который должен теперь работать достаточно хорошо для этого, но может не делать других вещей должным образом):
source ~/virtualenv/example/bin/activate
pip freeze > /tmp/requirements.txt
deactivate
Избавьтесь от python3.4, чтобы вернуться к привилегированному состоянию Ubuntu 16.04:
sudo dpkg --purge python3.4-minimal
sudo dpkg --force-depends --purge libpython3.4-minimal
Создайте новый virtualenv с правильными пакетами:
virtualenv -p python3.5 example
source ~/virtualenv/example/bin/activate
pip install -r /tmp/requirements.txt
Теперь это должно работать со всеми вашими старыми пакетами, но в python3.5. В случае, если...
См. также Обновление python в virtualenv
Ответ 2
У меня такая же проблема, и я решил воссоздать весь virtualenv
PS: Извините за мой плохой английский.
Ответ 3
У меня была такая же проблема сегодня, и именно так я ее решил:
Проблема:
Во-первых, как я понимаю, проблема возникает, потому что после обновления до Ubuntu 16.04 предыдущая версия Python также обновляется. В результате символические ссылки внутри любой среды Python3 больше не работают.
Решение 1: Как было написано выше, прямое решение - удалить все среды Python3 и создать их снова. Мне это не нравится, потому что я второй раз это делаю после обновления Ubuntu. Также, вероятно, мне нужно использовать несколько версий Python 3 в будущих проектах.
Решение 2: Это то, что я сегодня пробовал, и он работает нормально. Вместо использования virtualenv + virtualenvwrapper я решил попробовать комбинацию pyenv + pyenv-virtualenv
.
Основное различие между двумя подходами:
Pyenv фактически копирует весь Python каждый раз, когда вы создаете новую версию pyenv. В противоположность, virtualenv использует символические ссылки для уменьшения размера virtualenvs.
Howto:
- Установите pyenv, как описано здесь вместе с требуемыми версиями Python 2 и 3.
- Посмотрите здесь о том, как вы можете работать с virtualenv с помощью pyenv.
- Создайте новую среду, установите все зависимости с помощью pip и, надеюсь, забудьте о проблеме сломанных символических ссылок во время следующего обновления Ubuntu.
Ответ 4
У меня возникла одна и та же проблема, и мне удалось "исправить", воссоздав virtualenv и переустановив необходимые пакеты с помощью pip.
Создайте новый virtualenv:
virtualenv <new-virtualenv>
Активировать его:
source <new-virtualenv>/bin/activate
Установите пакеты:
pip install <required-packages>
И я был готов снова пойти!
Вы можете сохранить старый virtualenv, просто переименовав папку:
mv <old-virtualenv> <old-virtualenv>-backup
Ответ 5
Я исправил это, создав новый virtualenv и скопировав исполняемый файл python в старый сломанный virtualenv.