141

我是 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

似乎是什么问题,我该如何解决?

4

24 回答 24

185

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

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

sudo apt-get install python3-apt --reinstall

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

cd /usr/lib/python3/dist-packages
sudo ln -s apt_pkg.cpython-{your-version-number}-x86_64-linux-gnu.so apt_pkg.so

适当更换{your-version-number}

注意,以下将创建一个从 apt_pkg37m 到 apt_pkg36m 的符号链接。确保您链接到正确的版本,或者至少链接到现有版本ll apt_pkg.cpython-*并查看您安装了哪些版本。

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

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

于 2016-03-26T07:57:16.953 回答
141

通过这个解决它:

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试图得到正确的名字。

于 2017-06-18T06:02:39.860 回答
90

在我尝试从 deadsnakes 存储库安装 Python3.7 后,这发生在 Ubuntu 18.04.2 上。

解决方案是这样的

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

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

于 2019-07-22T14:08:48.410 回答
73

确保你有一个可以工作的 python-apt 包。您可以尝试删除并再次安装该软件包以解决无法找到 apt_pkg.so 的问题。

apt-get install python-apt
于 2012-12-05T06:46:16.437 回答
27

当新版本的 python 与旧版本一起安装时,通常会发生此错误,例如;

  • Ubuntu 18.04.1 附带 python 版本 3.6.6
  • 安装 ppa:deadsnakes/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
    

当我们使用 apt 安装非发行版 python3 版本时,它会将共享模块目录设置为 python3 的目录,通常它将是/usr/lib/python3.

大多数时候这没问题,但在某些情况下,不同版本的 python 依赖于不同的库或共享对象/库,而不是其他 python 版本,所以正如其他答案指出的那样,我们需要将 .SO 链接到正确的python版本。因此,如果我们在 64 位系统上安装了 python3.6,那么 apt_pkg .SO 链接将是

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 版本中进行选择的选项,其中它将选择给定的最高版本。

于 2018-11-05T11:59:07.960 回答
20

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

cd /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
于 2020-03-31T22:04:40.423 回答
19

@user8178061的解决方案运行良好,但我对我的版本进行了一些修改,即python3.7Ubuntu

apt_pkg.cpython-3m-i386-linux-gnu.soapt_pkg.cpython-36m-x86_64-linux-gnu.so

这里要执行的两个命令:

cd /usr/lib/python3/dist-packages

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

于 2019-11-28T13:21:39.290 回答
16

我看到每个人都在说如何通过奇怪的复制等来解决它,但没有人真正说出问题发生的原因。

所以让我解释一下,对于那些像我一样不想仅仅因为 SO 上的某人告诉他们而弄乱系统文件的人。


问题是:

  • 许多系统脚本都将 python3 shebang 硬编码到其中。你可以自己检查一下:
~$ 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 package python-apt/python3-apt是系统包,所以是默认系统python

因此,脚本将始终获取当前链接到的版本python3,但由于 apt 包不存在而失败。


一般解决方案:永远不要更改默认python3链接。曾经。这也适用于python链接——如果一个应用程序是用 Python2 编写的,其中包含一些在 Python3 中不起作用的旧语法元素,则该应用程序将无法工作。

[我的终端出现这种情况是因为我使用了 Terminator,它显然是用 Python2.7 编写的,与 Python3 不兼容。]


此处提供的解决方案建议复制/链接 apt 包文件或更改python3链接。

让我们分析一下:

  1. 复制/链接apt包

应该不是问题,因为从 Python3.4 开始,所有 python 脚本也可以在较新的版本上运行。

至今。但它可能会在未来中断 - 如果您将系统保持足够长的时间。

  1. 换回python3链接

这是一个很好的解决方案,因为我们可以回到“永不更改链接”


“但我喜欢只需要打字python!” - 我也喜欢这个!这就是我首先解决这个问题的方式!

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

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

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

于 2020-10-07T09:58:23.407 回答
13
  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 
    
于 2020-04-27T11:39:47.437 回答
7

apt_pkg.so由于某种原因,python3 dist-packages 目录中缺少我的安装。(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

我不确定我的升级是否损坏或为什么会这样。尝试升级后发生(精确->稀有->量子升级)

于 2013-12-13T00:16:42.940 回答
7

如果您使用 python 3.7 通过更新替代品将其降级到 python 3.6,这对我有用

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

sudo update-alternatives --config python3
于 2019-10-13T15:07:55.113 回答
5

最后的手段是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命令对你来说太多了,或者不知何故神奇地不起作用。

cpmv如果您只专注于使用一个 Python 版本,也可以使用上述方法。

于 2018-08-29T21:24:53.930 回答
3

我在 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'

我能够apt_pkg.cpython-34m-x86_64-linux-gnu.so 通过创建以下符号链接与我的初始 python 3.4 建立符号链接来修复此错误

sudo ln -s apt_pkg.cpython-34m-x86_64-linux-gnu.so apt_pkg.so
于 2020-07-07T14:24:11.463 回答
3

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

在下面/usr/lib/python3/dist-packages你会看到*34m*哪个 python 3.5 不能使用。扎扎回答符号链接就可以了。

于 2017-08-22T17:51:45.880 回答
3

除了为 制作符号链接外apt_pkg.so,您可能还想以apt_inst.so相同的方式制作apt_pkg.so

ln -s apt_inst.cpython-35m-x86_64-linux-gnu.so apt_inst.so 
于 2018-10-05T04:07:39.430 回答
1

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

于 2020-03-07T12:09:48.930 回答
1

花了 4 个小时后,我得到了这个最终对我有用的解决方案,我希望这会有所帮助......

重要的是要了解,有时当您从较旧的 python 版本升级时,某些包会保留在以前的版本路径中,所以这就是我所做的:

cd /usr/lib/python3/dist-packages

检查是否存在名为apt_pkg.cpython-35m-x86_64-linux-gnu.so或 34m 或 36m 列出文件的文件,找到后删除当前apt_pkg.so文件

/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

现在您可以再试一次,它应该可以工作。

于 2021-04-29T00:42:02.040 回答
1

这个变体对我有用。

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

于 2021-07-19T13:16:56.560 回答
1

我试图创建链接,但发生了许多其他问题。所以,你可以选择旧版本的python来安装东西:

sudo update-alternatives --config python3

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

于 2021-07-29T18:57:21.843 回答
0

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

1-连接到服务器的FTP

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

3-复制文件“apt_pkg.cpython-3 5 m-x86_64-linux-gnu.so”

4-将此重复的文件重命名为“apt_pkg.cpython-3 6 m-x86_64-linux-gnu.so”

而已!

于 2020-04-23T00:30:40.593 回答
0

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

我现在正在这样做,从 Python3.9 切换到 Python3.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-properties,python-launchpadlib等)完成此操作,现在add-apt-repository就像一个魅力。

哪些要重新编译?只需注意跑步的抱怨add-apt-repository

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

于 2021-12-20T20:48:18.817 回答
-1

请查看以下文档。

它可以帮助您解决问题。

解决python版本替换为ModuleNotFoundError: No module named 'apt_pkg'的问题

于 2020-03-18T19:23:14.713 回答
-4

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

export LC_ALL="en_US.UTF-8"

export LC_CTYPE="en_US.UTF-8"
于 2019-02-21T05:27:20.890 回答
-6

以防万一它有助于另一个,我终于解决了这个问题,这显然是由python版本冲突引起的,通过重定向链接python3,然后将其重定向到正确的python版本:

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

您可能需要输入正确的 python 版本,通过以下方式找到:

python3 -V
于 2018-01-05T15:37:22.250 回答