“Ваша установка python3 повреждается”

Я хочу обновить из 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?

9
задан 25 October 2019 в 14:49

7 ответов

Необходимо использовать версию 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.

12
ответ дан 16 November 2019 в 06:00

Я наблюдал это сообщение об ошибке относительно 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 относится к этой ситуации, также.

0
ответ дан 16 November 2019 в 06:00

Я просто столкнулся с этой проблемой на 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

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

23
ответ дан 16 November 2019 в 06:00

В основном решение этой проблемы состоит из создания /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, который ожидает Ваша система.

3
ответ дан 16 November 2019 в 06:00

Следующие команды должны работать:

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
1
ответ дан 14 June 2020 в 20:06

Ни один из ответов здесь не объясняет, как вы можете найти решение самостоятельно, поэтому я отправился в путешествие, в моем случае проверяя 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
10
ответ дан 3 October 2020 в 12:29

Вот исправление, когда я пытался обновить свою коробку 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
0
ответ дан 10 October 2020 в 05:17

Другие вопросы по тегам:

Похожие вопросы: