Python-dev 安装错误: Import Error: 没有名为 apt_pkg 的模块

我是 Debian 用户,我想安装 python-dev,但是当我以 root 用户身份运行 shell 中的代码时:

# aptitude install python-dev

我得到以下错误:

Traceback (most recent call last):
File "/usr/bin/apt-listchanges", line 28, in <module>
import apt_pkg
ImportError: No module named apt_pkg

问题出在哪里,我该如何解决?

309550 次浏览

确保您有一个可以工作的 python-apt 包。您可以尝试删除并再次安装该包,以修复 apt _ pkg 的问题。所以没被找到。

apt-get install python-apt

由于某种原因,我的安装缺少 python3 dist-package 目录中的 apt_pkg.so。(apt_pkg.cpython-33m-x86_64-linux-gnu.so在那里? !)但是我必须做一个符号链接 apt_pkg.so -> apt_pkg.cpython-33m-x86_64-linux-gnu.so/usr/lib/python3/dist-packages

我不确定我的升级程序是否坏了,也不知道为什么会出现这种情况。它发生在试图升级之后(精确-> 稀有-> 量化升级)

我在做 sudo apt-get update的时候遇到了这个问题,我的 env 是 debian8,python2.7 + 3.4(默认值) + 3.5。

下面的代码只会为 python 3.5重新创建一个 apt_pkg....so文件

sudo apt-get install python3-apt --reinstall

下面的代码解决了我的问题,

cd /usr/lib/python3/dist-packages

找到系统上安装的 python 版本的适当的. so 文件:

ls -l | grep apt_pkg

创建一个符号链接:

sudo ln -s apt_pkg.cpython-{your-version-number}-x86_64-linux-gnu.so apt_pkg.so

适当地替换 {your-version-number}

警告 ,下面将创建一个从 apt _ pkg37m 到 apt _ pkg36m 的符号链接。通过 ls apt_pkg.cpython-*确保链接到正确的,或者至少是现有的版本,并看看您已经安装了哪些。

sudo ln -s apt_pkg.cpython-{36m,37m}-x86_64-linux-gnu.so

因此,很明显,python3-apt 检查的是最高的 python 版本,而不是当前使用的 python 版本。

要理解为什么会发生这种情况,请看下面的答案: https://stackoverflow.com/a/64241654/21539

用这个解决问题:

cd /usr/lib/python3/dist-packages
cp apt_pkg.cpython-34m-i386-linux-gnu.so apt_pkg.so

或者:

cd /usr/lib/python3/dist-packages
cp apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.so

基本上,如果你得到一个 No such file or directory只是 ls尝试得到正确的名称。

如果你使用的是 python 3.5,降级到3.4。这是最安全的做法。

/usr/lib/python3/dist-packages下面,你会看到 Python 3.5不能使用的 *34m*

为了以防万一,我最终解决了这个问题,这个问题显然是由 Python 版本冲突引起的,我将链接 python3重定向,然后将其重定向到正确的 python 版本:

sudo rm /usr/bin/python3
sudo ln -s /usr/bin/python3.4

您可能需要输入正确的 python 版本,如下所示:

python3 -V

最后一招是 sudo cp /usr/lib/python3/dist-packages/apt_pkg.cpython-35m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/apt_pkg.cpython-36m-x86_64-linux-gnu.so 如果 ln命令对您来说太难了,或者不知怎么奇迹般地不起作用。

如果您只专注于使用一个 Python 版本,那么上面的 cp也可以是 mv

除了为 apt_pkg.so制作一个符号链接之外,您可能还希望以与 apt_pkg.so相同的方式制作 apt_inst.so

ln -s apt_inst.cpython-35m-x86_64-linux-gnu.so apt_inst.so

当较新版本的 python 与较旧版本一起安装时,这个错误经常发生,例如;

  • Ubuntu18.04.1附带 Python 3.6.6版本
  • 已安装的 ppa: Dead Snake/python3.7.1或其他选项
  • 运行一个使用 apt _ pkg 模块的命令并得到一个错误,如;

        from CommandNotFound.db.db import SqliteDatabase
    File "/usr/lib/python3/dist-packages/CommandNotFound/db/db.py", line 5, in <module>
    import apt_pkg
    

When we install a non-distro python3 version with apt it will set a shared module directory to be that of python3 most usually it will be /usr/lib/python3.

Most of the time this will be ok, but under some circumstances the different versions of python rely on different libraries or shared objects/libraries than the other python version does, so as other answers have pointed out we need to link the .SO to the correct python version. So if we have python3.6 installed on a 64bit system then the apt_pkg .SO link would be

sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so

但问题在于,当我们安装较新的 python 版本时,链接将更新为指向最新的 python 版本,这将导致找不到 apt _ pkg 模块的错误。 通过检查 Python 的哪个版本与您的发行版一起发布,您可以创建如上所示的链接。 或者,我们使用一种方法为命令提供一个 Python 版本的选择,以链接.SO,例如;

sudo ln -s apt_pkg.cpython-{36m,35m,34m}-x86_64-linux-gnu.so apt_pkg.so

因为 python 将创建到最新安装的 python 版本的链接,所以我们给命令一个从3个 python 版本中选择的选项,它将选择给定的最高版本。

请尝试通过设置语言环境变量来解决这个问题:

export LC_ALL="en_US.UTF-8"


export LC_CTYPE="en_US.UTF-8"

这发生在我在 Ubuntu 18.04.2上,当时我试图从死蛇回购系统安装 Python 3.7。

解决办法是这样的

1) cd /usr/lib/python3/dist-packages/

2) sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so

如果你使用 python 3.7,通过更新 Alternative 将它降级到 python 3.6,这对我很有用

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1


sudo update-alternatives --config python3

@ user8178061的解决方案工作得很好,但我做了一些修改,我的版本是 python3.7与 Ubuntu

我用 apt_pkg.cpython-36m-x86_64-linux-gnu.so代替了 apt_pkg.cpython-3m-i386-linux-gnu.so

下面是要执行的两个命令:

cd /usr/lib/python3/dist-packages

sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so

Windows 10 WSL v1(Ubuntu 16.04.6 LTS)

这个 Reddit 回答(稍作修改就可以了)

sudo ln -sfn /usr/lib/python3/dist-packages/apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.so

在 ubuntu18.04上更新 python3.7之后,这对我很有用

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

没有一个答案适合我(我使用的是 Ubuntu 16.04和 Python 3.6)。所以我最终解决了这个问题:

1-连接到服务器的 FTP

2-转到文件夹“/usr/lib/python3/dist- 包/”

3-复制文件“ apt _ pkg. cpython-35m-x86 _ 64-linux-gnu.so”

4-将这个复制的文件重命名为“ apt _ pkg. cpython-36m-x86 _ 64-linux-gnu.so”

就是这样!

  1. 检查默认的 Python 3版本:

    python3 --version
    Python 3.7.5
    
  2. cd转换为 /usr/lib/python3/dist-packages并检查 apt_pkg.*文件,您会发现没有默认的 Python 版本:

    ll apt_pkg.*
    apt_pkg.cpython-36m-x86_64-linux-gnu.so
    
  3. 创建符号链接:

    sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.cpython-37m-x86_64-linux-gnu.so
    

我在 Ubuntu 16.04上,并且升级到了 Python 3.7。下面是我在尝试添加 PPA 时出现的错误

    sudo add-apt-repository ppa:ubuntu-toolchain-r/test
Traceback (most recent call last):
File "/usr/bin/add-apt-repository", line 11, in <module>
from softwareproperties.SoftwareProperties import SoftwareProperties, shortcut_handler
File "/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py", line 27, in <module>
import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

通过创建以下符号链接,我可以通过在初始 python 3.4 apt_pkg.cpython-34m-x86_64-linux-gnu.so中创建符号链接来修复这个错误

sudo ln -s apt_pkg.cpython-34m-x86_64-linux-gnu.so apt_pkg.so

我看到每个人都说如何用奇怪的复制等修复它,但没有人真正说 为什么的问题发生。

所以让我来解释一下,对于那些喜欢我的人来说,不想仅仅因为某人告诉他们这样做,就去弄乱系统文件。


问题在于:

  • 许多系统脚本中都有 python3的硬编码。您可以自己检查:
~$ grep -R "\#\!/usr/bin/python3" /usr/lib/*


/usr/lib/cnf-update-db:#!/usr/bin/python3
/usr/lib/command-not-found:#!/usr/bin/python3
/usr/lib/cups/filter/pstotiff:#!/usr/bin/python3
/usr/lib/cups/filter/rastertosag-gdi:#!/usr/bin/python3 -u
grep: /usr/lib/cups/backend/cups-brf: Permission denied
/usr/lib/cups/backend/hpfax:#!/usr/bin/python3
/usr/lib/language-selector/ls-dbus-backend:#!/usr/bin/python3
/usr/lib/python3/dist-packages/language_support_pkgs.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/softwareproperties/MirrorTest.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/installdriver.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/openprinting.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/xmldriverprefs.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/smburi.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/ppds.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/debug.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/DistUpgrade/dist-upgrade.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/CommandNotFound/db/creator.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/CommandNotFound/db/db.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/Quirks/quirkreader.py:#!/usr/bin/python3
grep: /usr/lib/ssl/private: Permission denied
/usr/lib/system-service/system-service-d:#!/usr/bin/python3
/usr/lib/ubuntu-release-upgrader/check-new-release-gtk:#!/usr/bin/python3
/usr/lib/ubuntu-release-upgrader/do-partial-upgrade:#!/usr/bin/python3
/usr/lib/ubuntu-release-upgrader/check-new-release:#!/usr/bin/python3
/usr/lib/update-notifier/package-data-downloader:#!/usr/bin/python3
/usr/lib/update-notifier/backend_helper.py:#!/usr/bin/python3
/usr/lib/update-notifier/apt_check.py:#!/usr/bin/python3
/usr/lib/update-notifier/apt-check:#!/usr/bin/python3


  • Python apt 包 python-apt/python3-apt是一个系统包,因此它是默认的系统 python

因此,这些脚本将始终获得当前链接到 python3的版本,但是由于没有 apt 包而失败。


通用解决方案: 永远不要更改默认 python3链接。永远不会。这也适用于 python链接——如果一个应用程序是用 Python 2编写的,其中一些旧的语法元素在 Python 3中不能工作,那么这个应用程序就不能工作。

[我的终端以那种方式中断,因为我使用的是终结者,它显然是用 Python 2.7编写的,与 Python 3不兼容。]


这里提供的解决方案要么建议复制/链接 apt 包文件,要么更改 python3链接。

让我们同时分析:

  1. 复制/链接 apt 包

这个 不应该是个问题,因为从 Python 3.4开始,所有的 python 脚本都可以在更新的版本上工作。

到目前为止。但是如果你保持你的系统足够长的时间,它可能在未来破裂。

  1. 更改 python3链接返回

这是一个伟大的解决方案,因为我们可以回到“永远不要改变链接”


“但我喜欢只打 python!”我也喜欢!我一开始就是这么遇到这个问题的!

  1. 一般来说,您应该避免手动更改系统链接-使用 update-alternatives来链接不同的版本 。这适用于任何有多个版本的应用程序。这仍然会破坏那些系统脚本(因为它确实改变了链接) ,但是您可以轻松地来回切换,而不用担心您是否按照正确的顺序放置了链接和目录,或者是否输入错误。

  2. 考虑使用其他名称以外的 python/python3为您的链接或别名。

  3. 或者将您自己的 python/python3链接添加到 PATH (就像虚拟环境那样) ,而不更改系统链接。

在花了4个小时后,我得到了这个解决方案,最终为我工作,我希望这将有所帮助..。

有时候当你从旧的 Python 版本升级时,有些软件包会停留在旧版本的路径上,这一点很重要,所以我是这样做的:

cd /usr/lib/python3/dist-packages

检查是否存在一个名为 apt_pkg.cpython-35m-x86_64-linux-gnu.so或34m 或36m 的文件列出了这些文件,当您找到它时,删除

/usr/lib/python3/dist-packages

最后使用 apt_pkg.so创建一个具有正确路径的链接,如下所示:

cd /usr/lib/python3/dist-packages
sudo ln -s apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.so

现在你可以再试一次,应该可以了。

这个变体对我有用。

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

如果你得到一个错误信息,说太多级别的符号链接,如下所示:

cp: failed to access '/usr/lib/python3/dist-packages/apt_pkg.so': Too many levels of symbolic links

然后您需要简单地解除 apt _ pkg. so 文件的链接:

sudo unlink apt_pkg.so

然后使用命令

sudo cp apt_pkg.cpython-38-x86_64-linux-gnu.so apt_pkg.so

祝你好运!

原答案: https://askubuntu.com/a/1227625

我试图创建这个链接,但发生了许多其他问题。因此,您可以选择旧版本的 python 来安装:

sudo update-alternatives --config python3

并在使用同一命令后立即返回到所需的版本。 希望有用。

对我来说,最干净的解决方案是使用新的 Python 版本在其特定空间中重新构建相关的库。

我正在做这件事,从 Python 3.9切换到 Python 3.10.1。

所以:

cd /tmp/
apt source python3-apt
cd python-apt-version-ecc
python3-new-version setup.py build
python3-new-version setup.py install

对于依赖包(software-propertiespython-launchpadlib等等)也可以这样做,现在 add-apt-repository的工作方式非常好。

哪些需要重新编译? 只需要注意运行 add-apt-repository的抱怨。

顺便说一下,我在 Ubuntu 21.04上,但是逻辑在任何类似 Debian 的系统上都是一样的。

在我的例子中,我运行以下命令,它修复了错误:

sudo apt install --reinstall python3 python python3-minimal --fix-broken