Я хочу обновить из 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
?
Необходимо использовать версию 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.
Я наблюдал это сообщение об ошибке относительно 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 launchpad
, Таким образом, одно решение состоит в том, чтобы полностью удалить питона из альтернативной системы и добавить ссылку вручную, как описано в самом популярном ответе.
, Если Вы не хотите удалять питона из альтернативной системы, просто измените ссылку только в течение времени во время процесса обновления:
# rm /usr/bin/python
# ln -sf /usr/bin/python2.7 /usr/bin/python
# do-release-upgrade
Это работало на меня.
Во время процесса обновления, ссылка автоматически восстановлена. Таким образом, когда обновление закончено, оно указывает на вход питона в справочнике альтернатив:
$ 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 относится к этой ситуации, также.
Я просто столкнулся с этой проблемой на 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
Также см. этот комментарий, ниже которого описывает более точное решение, которое также лучше объясняет, что продолжается и как зафиксировать его.
В основном решение этой проблемы состоит из создания /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, который ожидает Ваша система.
Следующие команды должны работать:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 2
sudo rm /usr/bin/python
sudo ln -s /usr/bin/python2.7 /usr/bin/python
sudo do-release-upgrade
Ни один из ответов здесь не объясняет, как вы можете найти решение самостоятельно, поэтому я отправился в путешествие, в моем случае проверяя do-release-upgrade
в KDE Neon на Ubuntu 18 LTS.
Во-первых, я запустил его с помощью tracefile -w
и обнаружил, что фактические сценарии обновления-релиза были загружены в каталог /tmp/ubuntu-release-upgrader-xxxxxxxx
.
Используя grep
в этом каталоге, я обнаружил сообщение об ошибке в DistUpgradeController.py
:
❯ grep --line-number --recursive --binary-files=without-match "python3 install is corrupted"
DistUpgradeController.py:426: _("Your python3 install is corrupted. "
Поэтому я проверил окружающий код, который использовал функцию _pythonSymlinkCheck
, перешел к этому и обнаружил корень проблемы:
Сценарий ожидал, что символическая ссылка /usr/bin/python3
будет точно соответствовать /usr/bin/
:
binaries_and_dirnames = [("python3", "python3")]
for binary, dirname in binaries_and_dirnames:
debian_defaults = '/usr/share/%s/debian_defaults' % dirname
if os.path.exists(debian_defaults):
config = SafeConfigParser()
with open(debian_defaults) as f:
config.readfp(f)
try:
expected_default = config.get('DEFAULT', 'default-version')
except NoOptionError:
logging.debug("no default version for %s found in '%s'" %
(binary, config))
return False
try:
fs_default_version = os.readlink('/usr/bin/%s' % binary)
except OSError as e:
logging.error("os.readlink failed (%s)" % e)
return False
if not fs_default_version in (expected_default, os.path.join('/usr/bin', expected_default)):
Как видно из сценария,
— это ключ default-version
в разделе DEFAULT
из /usr/share/python3/debian_defaults
:
❯ cat /usr/share/python3/debian_defaults
[DEFAULT]
# the default python3 version
default-version = python3.6
Моя ссылка действительно указывала на /usr/bin/python3.6
, но через дополнительную косвенность от update-alternatives
, которую скрипт не разрешает:
❯ python
Python 3.6.9 (default, Jul 17 2020, 12:50:27)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.readlink("/usr/bin/python3")
'/etc/alternatives/python3'
>>> os.readlink("/etc/alternatives/python3")
'/usr/bin/python3.6'
Поэтому в конце концов я также решил ядерный вариант, но теперь с полным пониманием происходящего :)
sudo ln -sf /usr/bin/python3.6 /usr/bin/python
Вот исправление, когда я пытался обновить свою коробку xenial 16.04 до 18.04
mkdir /usr/share/python2/
cp /usr/share/python/debian_defaults /usr/share/python2/debian_defaults
cd /usr/bin/python2 /usr/bin/python.27
иначе ubuntu-release-upgrader будет жаловаться на такие сообщения, как
/usr/lib/python3$ sudo do-release-upgrade
Checking for a new Ubuntu release
Get:1 Upgrade tool signature [819 B]
Get:2 Upgrade tool [1,245 kB]
Fetched 1,245 kB in 0s (0 B/s)
authenticate 'bionic.tar.gz' against 'bionic.tar.gz.gpg'
extracting 'bionic.tar.gz'
Reading cache
Checking package manager
Can not upgrade
Your python3 install is corrupted. Please fix the '/usr/bin/python3'
symlink.
Основной файл журнала находится по адресу
/var/log/dist-upgrade/main.log
и там программа обновления выпуска пожаловалась. Кроме того, другой файл, который вы, возможно, захотите проверить, находится в /tmp/ubuntu-release-upgrader/*
less /tmp/ubuntu-release-upgrader/*/DistUpgradeController.py