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

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)

Как я могу это исправить?

4b9b3361

Ответ 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.