本文纯属在我的环境下操作。每个系统有不同的环境,请仅作参考。

在我前几天登上一台很久没有用过的 Ubuntu VPS 的时候发现还是使用的密码登录,为了让我的登录更安全,我使用了一键从 Github 拉取公钥的 ssh-import-id-gh (具体请查看我的这篇博客) 的命令。

结果发现居然报错

ERROR module 'platform' has no attribute 'dist'

马上哈,我就知道有点大事不妙了,但是由于我是无脑懒狗,我就直接复制了错误去Google(我先purge+remove了python3.9)。我打开这篇 Stackflow 的贴。看也不看问题,直接滑下去复制粘贴第一个高 upvoted 答案。结果发现我甚至运行不了第二个命令。我以为是我python3.9有问题,就想着换个版本

update-alternatives --config python

然后告诉我没有其他版本可换。然后呢?我又去重复第一步,复制粘贴搜索随便选了一个 askubuntu 的帖子,直接滑下去继续开始复制粘贴。当然,我还是把帖子里用的3.10换成了我的3.9版本的。

apt remove libpython3.9-minimal libpython3.9-stdlib

然后也不行,如果你看了这个贴子就会知道他就只是让这个package看起来不存在,让 Linux 以为这个 package 没了,指望着系统会去重装他。其实我这个时候仔细看看报错我就会发现

dpkg: error processing package python3-dbus (--configure):  dependency problems - leaving unconfigured

但是这个时候我发现我的 bashrc 无缘无故消失了(可能是之前干什么作死导致的)

vi ~/.bashrc

自己随便加点什么。这时再按照之前方法把 python3 的 /dpkg/info/ 空了然后再一通apt

mv /var/lib/dpkg/info/python3* ~/tmp
mv /var/lib/dpkg/info/unattended-upgrades* ~/tmp && sudo mv /var/lib/dpkg/info/software-properties-common* ~/tmp
cp -r /var/lib/dpkg/status $HOME
echo > /var/lib/dpkg/status
apt-get clean
apt-get update
apt-get upgrade
apt-get install -f

我本以为再 run 一下下面的命令就好了。

dpkg --configure -a
apt-get install -f

但是只是让报错变短了很多而已,至少不用看到一大堆python3的dependencies报错了。现在变成了这样。

E: Encountered a section with no Package: header E: Problem with MergeList /var/lib/dpkg/status E: The package lists or status file could not be parsed or opened.

这个 post你就可以知道是 /var/lib/dpkg/status 的问题。因为在上面没有做 backup 那么只能用上次执行 dpkg 系统自动保存的老 status 文件来修复。

// 使用 diff 命令查看目前的 status 和老 status 的差别
diff /var/lib/dpkg/status-old /var/lib/dpkg/status
// 替换新 status 到老 status
mv /var/lib/dpkg/status-old /var/lib/dpkg/status

然后我遇到以下报错

/var/lib/dpkg/info/ufw.postinst: /usr/bin/py3compile: /usr/bin/python3: bad interpreter: No such file or directory

我基本上只是 reconfigure packages + 安装 python3 就好了。

dpkg --configure -a
apt install -f --reinstall python3-minimal

到这里你基本上 apt update 就没问题了。不过可能会遇到

dpkg: warning: files list file for package 'xxxxxxx' missing; assuming package has no files currently installed

因为你的系统 expect 你还有之前的一大堆 python dependencies。所以这时候用下网上的小脚本全部给他装上就基本上没什么问题了。

vim depen.sh
// 复制以下内容
for package in $(sudo apt-get install catdoc 2>&1 | grep "warning: files list file for package '" | grep -Po "[^'\n ]+'" | grep -Po "[^']+");
do
  sudo apt-get -y install --reinstall "$package"
done

// 保存后直接运行。
/bin/bash ./depen.sh

等脚本自己装完就好了。

这件事告诉我们不要出了问题网上搜了连题主问题都不看就直接照抄答案。。。
也不要随便碰 /var/lib/dpkg/status

你以为结束了,但是我到这发现只是 apt update 不报错了,但是如果你 apt upgrade 还是会报错。。。

dpkg: error processing package python3 (--configure):
 package is in a very bad inconsistent state; you should
 reinstall it before attempting configuration
Errors were encountered while processing:
 python3
E: Sub-process /usr/bin/dpkg returned an error code (1)

我想要强制重装 python3 但是没用。我就想着直接下载 package 用 dpkg 来安装。

dpkg -i python3-minimal_3.6.7-1~18.04_amd64.deb

这时就会安装 python3.6 ,虽然还是会错误结尾但是确实是装上去了。我之后 fix 了一下再重装 python3。

apt-get install -f
apt install -f --reinstall python3

这时候重装就没问题了。到这基本结束但是还是会报 missing,我们上面虽然用脚本装过了但是如果你尝试手动重装 3.8 就会发现下面的报错。

dpkg: warning: files list file for package 'python3.8' missing; assuming package has no files currently installed
dpkg: warning: files list file for package 'python3.8-minimal' missing; assuming package has no files currently installed

//3.8 报错
Reinstallation of python3.8 is not possible, it cannot be downloaded.

Python3.8 大概率是broken package了,我们直接强制把它删除。但是在这之前要确认 python3 -V 是别的版本,不然前功尽弃了。然后再auto remove一下残余dependencies,不然会装不上新的 python3.8。

// 这个命令可以查看残留的dependencies
apt rdepends python3.8

最后直接安装 python3.8就好啦。结束。