如何修复 Ubuntu 中损坏的 apt-get?

如何修复 Ubuntu 中损坏的 apt-get?

我想我可能已经破坏了 python 的某些东西,因为我之前尝试更新到 python3,将其链接到 /usr/bin/python (我现在意识到这是错误的做法)没有专门使用的命令。

我无法再在我的系统上获取 apt-get update 或任何 apt-get 命令。

这是 apt-get 更新的结果:

Hit:1 http://archive.ubuntu.com/ubuntu bionic InRelease
Hit:2 http://archive.ubuntu.com/ubuntu bionic-updates InRelease
Hit:3 https://packages.microsoft.com/repos/azure-cli bionic InRelease
Hit:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease
Hit:5 http://security.ubuntu.com/ubuntu bionic-security InRelease
Hit:6 http://ppa.launchpad.net/deadsnakes/ppa/ubuntu bionic InRelease
Hit:7 https://apt.releases.hashicorp.com bionic InRelease
Traceback (most recent call last):
  File "/usr/lib/cnf-update-db", line 8, in <module>
    from CommandNotFound.db.creator import DbCreator
  File "/usr/lib/python3/dist-packages/CommandNotFound/db/creator.py", line 11, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
Reading package lists... Done
E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/lib/command-not-found/ -a -e /usr/lib/cnf-update-db; then /usr/lib/cnf-update-db > /dev/null; fi'
E: Sub-process returned an error code

我大概还能够修复我的 pythonpath:

~$ sudo apt --fix-broken install python
Reading package lists... Done
Building dependency tree
Reading state information... Done
python is already the newest version (2.7.15~rc1-1).
0 upgraded, 0 newly installed, 0 to remove and 182 not upgraded.

现在我的 python 链接如下所示:

~$ ls -al /usr/bin/python
lrwxrwxrwx 1 root root 18 Apr  1 10:30 /usr/bin/python -> /usr/bin/python2.7

并且 python3 不再链接到 /usr/bin/python:

~$ ls -al /usr/bin/python3
lrwxrwxrwx 1 root root 18 Mar  1 21:22 /usr/bin/python3 -> /usr/bin/python3.8

通过使用 update-alternatives 在这里取得了一些微小的进展:

update-alternatives --list python
/usr/bin/python2.7
/usr/bin/python3.8


sudo update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).

  Selection    Path                Priority   Status
------------------------------------------------------------
  0            /usr/bin/python3.8   2         auto mode
* 1            /usr/bin/python2.7   1         manual mode
  2            /usr/bin/python3.8   2         manual mode

无论我将其保留在 python3.8 还是切换到 python2.7(使用 update-alternatives --config python),我都会从 apt-get 获得相同的输出

有人对如何解决这个问题有任何理论吗?尽管将 python 替代方案设置为 2.7,但它仍然指向 python3。我认为 update-conf-db 存在问题。

答案1

您遇到的错误不是apt直接引起的,而是由其钩子之一引起的;具体来说,是command-not-found(当您尝试运行系统上不存在的命令时告诉您要安装哪个软件包的帮助程序)的更新。apt update本身已成功完成。

为了避免错误,请禁用钩子:

sudo mv /etc/apt/apt.conf.d/50command-not-found{,.disabled}

然后您应该能够运行apt update而不会看到错误。如果另一个钩子失败,您可以使用与上面相同的技术禁用它(另请参阅Debian buster arm64 apt 返回错误消息,软件包安装仍然有效)。

update-cnf-db是一个 Python 3 脚本,因此您的 Python 3 设置也可能会被破坏。确定如何根据您的情况解决该问题需要更多信息;你应该确保你/usr/bin/python3指向 Ubuntu 的 Python 3 版本。

开始update-cnf-db工作后,您可以通过反转上面的命令来重新启用挂钩:

sudo mv /etc/apt/apt.conf.d/50command-not-found{.disabled,}

答案2

ubuntu 18.04 中也出现同样的错误。

执行后sudo apt update出现如下错误:

Hit:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease
Traceback (most recent call last):
  File "/usr/lib/cnf-update-db", line 8, in <module>
    from CommandNotFound.db.creator import DbCreator
  File "/usr/lib/python3/dist-packages/CommandNotFound/db/creator.py", line 11, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
Reading package lists... Done
E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/lib/command-not-found/ -a -e /usr/lib/cnf-update-db; then /usr/lib/cnf-update-db > /dev/null; fi'
E: Sub-process returned an error code

操作系统环境是

NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

我尝试过了 :

cd /usr/lib/python3/dist-packages
ls -la /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so

一切都好。

相关内容