«Ваша установка на python3 повреждена»

13

Я хочу обновить Ubuntu 16.04.5 LTS до 18.04, поэтому запустился sudo do-release-upgrade. После скачивания и распаковки bionic.tar.gzя получаю:

Can not upgrade 

Your python3 install is corrupted. Please fix the '/usr/bin/python3'
symlink.

Я видел, как исправить "установка Python поврежден"? и поэтому я sudo ln -sf /usr/bin/python3.6 /usr/bin/python3подумал, что это будет похожая проблема. Но это не сработало (все то же сообщение об ошибке).

У меня есть несколько версий Python:

$ ls /usr/lib | grep python
python2.7
python3
python3.5
python3.6

$ update-alternatives --display python3
python3 - auto mode
  link best version is /usr/bin/python3.6
  link currently points to /usr/bin/python3.6
  link python3 is /usr/bin/python3
/usr/bin/python3.5 - priority 1
/usr/bin/python3.6 - priority 2

Как мне исправить python3?

mRcSchwering
источник
1
А как насчет переустановки (как указано в принятом ответе)?
Кульфи

Ответы:

16

Вам нужно использовать версию Python 3 по умолчанию для 16.04. Это 3,5 , а не 3,6. Итак, бегите:

sudo ln -sf /usr/bin/python3.5 /usr/bin/python3

Если это не сработает, попробуйте переустановить python3пакет.

sudo apt-get install --reinstall python3

Кстати, update-alternatives --display python3должен дать вам update-alternatives: error: no alternatives for python3. Различные версии Python не являются альтернативами в Ubuntu.

wjandrea
источник
32

Я только столкнулся с этой проблемой на Pop! _OS 18.04, пытаясь обновиться до 18.10, и оказалось, что проблема заключалась в символической ссылке для, /usr/bin/pythonа не для /usr/bin/python3. Я /usr/bin/python3.6настроил в качестве альтернативы python(не python3), и когда я изменил это, я мог работать, do-release-upgradeкак ожидалось.

Я хотел бы, чтобы сообщение об ошибке указывалось pythonи не было python3.


До этого с проблемой:

$ update-alternatives --display python
python - manual mode
  link best version is /usr/bin/python3.6
  link currently points to /usr/bin/python2.7
  link python is /usr/bin/python
/usr/bin/python2.7 - priority 1
/usr/bin/python3.6 - priority 2 

Я исправил это так:

$ sudo update-alternatives --remove-all python
$ sudo ln -sf /usr/bin/python2.7 /usr/bin/python

Также смотрите этот комментарий ниже, который описывает более точное решение, которое также лучше объясняет, что происходит и как это исправить.

JB Rainsberger
источник
1
Да, я могу подтвердить, что решение работает, на это должен быть принят ответ.
Сумит Джайн
Это сработало и для меня
Эфи Кальтиримиду
3
Выбор update-alternatives --remove-all pythonбыл определенно ненужным излишним: все, что вам нужно было сделать, это использовать, update-alternatives --config pythonчтобы pythonуказать на последнюю версию python2.*(например python2.7), а затем использовать, update-alternatives --config python3чтобы python3указать конкретно python3.6 - это версия Python 3 по умолчанию для 18.04.
KiriSakow
2
Если вам нужно перейти на python 3.7 в Ubuntu 18.04, не делайте этого в масштабе всей системы - или у вас наверняка возникнут неприятные небольшие проблемы в системе с такими необходимыми инструментами, как gnome-terminal, update-managerи т. Д. Вместо этого используйте виртуальные среды (документация здесь и здесь )
KiriSakow
@Kiri Существуют способы установки других версий Python без замены системной версии. Например с помощью deadsnakes PPA .
wjandrea
5

Я наблюдал это сообщение об ошибке в Windows 10 1903 с запущенной WSL Ubuntu, когда хотел обновить систему с 16.04 LTS до 18.04 LTS .

После do-release-upgradeнеудачи я переключил pythonальтернативы на каждый предложенный вариант update-alternatives --config pythonи снова выполнил команду обновления. Это не помогло.

Затем я проверил файл журнала, /var/log/dist-upgrade/main.logкоторый содержал строки

2019-09-02 20:58:08,686 DEBUG _pythonSymlinkCheck run
2019-09-02 20:58:08,687 DEBUG python symlink points to: '/etc/alternatives/python', but expected is 'python2.7' or
'/usr/bin/python2.7'
2019-09-02 20:58:08,688 ERROR pythonSymlinkCheck() failed, aborting

Поэтому, хотя в сообщении об ошибке упоминается python3 , проблема заключается в python2 .

Сценарий обновления проверяет наличие /usr/bin/pythonссылок /usr/bin/python2на исходный код DistUpgrade/DistUpgradeController.pyздесь: панель запуска ubuntu

Поэтому одним из решений является полное удаление python из альтернативной системы и добавление ссылки вручную, как описано в самом популярном ответе.

Если вы не хотите удалять python из альтернативной системы, просто измените ссылку только на время процесса обновления:

# rm /usr/bin/python 
# ln -sf /usr/bin/python2.7 /usr/bin/python
# do-release-upgrade

Это сработало для меня.

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

$ ls -l /usr/bin/python
lrwxrwxrwx 1 root root 24 Sep  2 22:01 /usr/bin/python -> /etc/alternatives/python

Изменить: для подробной информации, проблема может также появиться, если вы обновляете с 18.04 LTS до 19.04, и anwser также относится к этой ситуации.

Даниэль К.
источник
1
Примечание. Этот ответ также относится к обновлению Ubuntu 18.04 LTS до 19.04. Я попробовал это сам после того, как обновление до 18.04 закончилось успешно.
Даниэль К.
3

По сути, решение этой проблемы состоит в том, чтобы /usr/bin/pythonуказать правильную версию Python, которую ожидает релиз Ubuntu (например, в 16.04 был Python2.7, а в 18.04 - Python3.6).

Если в вашей системе установлено несколько версий Python, возможно, вы используете их update-alternativesдля управления. Не имеет большого значения, что ваш вариант по умолчанию для Python - это верная версия, которую ожидает ваша система (3.6 в Ubuntu 18.04), она не будет работать.

Причина , почему это не работает так, при использовании update-alternatives, /usr/bin/python3указывает /etc/alternatives/python3, и кажется , что это не совсем то же самое, что /usr/bin/python3пункт /usr/bin/python3.6.

Вот почему решение этой проблемы часто состоит в том, чтобы перестать управлять версиями Python3 update-alternativesи /usr/bin/python3указать правильную версию Python3, которую ожидает ваша система.

Диего Пино
источник
/usr/bin/pythonне существует в чистой установке 18.04, но он существует, если вы делаете обновление вместо чистой установки или устанавливаете pythonпакет, и в этом случае это должен быть Python 2.7, а не 3.6. Смотри PEP 394 .
wjandrea
Для ясности, разные версии Python не являются альтернативами в Ubuntu и не должны управляться с помощью update-alternatives. Это связано с тем, что ОС зависит от установленной версии.
wjandrea