python-dev安装错误:ImportError:没有名为apt_pkg的模块

Bel*_*gor 58 python linux installation debian

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

# aptitude install python-dev
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

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

zha*_*zha 89

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

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

sudo apt-get install python3-apt --reinstall
Run Code Online (Sandbox Code Playgroud)

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

cd /usr/lib/python3/dist-packages
sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.so
Run Code Online (Sandbox Code Playgroud)

显然,python3-apt检查最高的python版本,而不是当前使用的python版本.

  • 你真了不起!对我来说,对于python3.6来说,它是'sudo ln -s apt_pkg.cpython- {35m,36m} -x86_64-linux-gnu.so`,这个可怕的bug现在已经消失了. (33认同)
  • 在Ubuntu 18.04中使用sudo apt install python3.7在默认3.6旁边安装Python 3.7之后,我在尝试运行pip时遇到了apt_pkg错误,因此我需要运行cd / usr / lib / python3 / dist-packages `sudo ln -s apt_pkg.cpython- {36m,37m} -x86_64-linux-gnu.so`然后`sudo apt install python3-pip`。 (19认同)
  • `sudo ln -s apt_pkg.cpython- {35m,34m} -x86_64-linux-gnu.so`应更改为`sudo ln -s apt_pkg.cpython- {35m,34m} -x86_64-linux-gnu.so apt_pkg .so` (12认同)
  • 对于python 3.6,命令将为`sudo ln -s apt_pkg.cpython- {35m,36m} -x86_64-linux-gnu.so` (2认同)
  • 这些大括号不是 ln 命令的属性。它们调用 shell 大括号扩展,请参阅 https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html (2认同)

小智 82

解决这个问题:

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

要么:

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

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

  • 在 Ubuntu 18.04 上,使用这个 $ cd /usr/lib/python3/dist-packages $ sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so (4认同)

Arn*_*tig 48

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

apt-get install python-apt
Run Code Online (Sandbox Code Playgroud)

  • 使用`apt-get remove --purge python-apt`删除它并再次安装它 (10认同)
  • 注意其他依赖项.我在Ubuntu中快速删除了包(也是),并且还删除了许多其他依赖项(例如ubuntu-desktop).但是,不注意日志中的注释是我的错. (7认同)
  • @Arnestig 删除`python-apt` 听起来很危险!!吸取了一次教训,我不会尝试。 (3认同)
  • 从 3.5 升级到 3.9 后无法使用。 (2认同)

Hug*_*ohm 19

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

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


小智 18

在我尝试从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

  • 只是想向其他人确认这确实对我有用。 (4认同)
  • 太疯狂了,谢谢!在docker中时:`RUN ln -s /usr/lib/python3/dist-packages/apt_pkg.cpython-36m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/apt_pkg.so` (2认同)
  • 是的,这就是解决方案:) (2认同)
  • 2004 年 4 月 18 日,升级到 python 3.7,这对我也有用!谢谢!! (2认同)

小智 18

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

cd /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
Run Code Online (Sandbox Code Playgroud)

  • 在 ubuntu18.04 上升级 **python 3.8** 后,这对我有用。 (2认同)

Jam*_*sey 13

当同时安装了新版本的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
    
    Run Code Online (Sandbox Code Playgroud)

当我们安装带有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
Run Code Online (Sandbox Code Playgroud)

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

sudo ln -s apt_pkg.cpython-{36m,35m,34m}-x86_64-linux-gnu.so apt_pkg.so
Run Code Online (Sandbox Code Playgroud)

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

  • 运行18.04.2,您的第一个建议对我有用,我最终可以毫无错误地运行sudo apt-get更新。您的第二条建议返回一个错误,指出apt-get.so不是文件夹。 (2认同)

h4z*_*4z3 12

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

所以让我解释一下,对于那些喜欢我的人,不想仅仅因为 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

Run Code Online (Sandbox Code Playgroud)
  • 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而是使用链接不同的版本。这适用于具有多个版本的任何应用程序。这仍然会破坏那些系统脚本(因为它确实改变了链接),但是您可以轻松地来回切换,而不必担心是否将 link 和 dest 放在正确的顺序或打错字。

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

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


Nic*_*mer 10

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

    python3 --version
    Python 3.7.5
    
    Run Code Online (Sandbox Code Playgroud)
  2. cd进入/usr/lib/python3/dist-packages并检查apt_pkg.*文件。你会发现你的默认 Python 版本没有:

    ll apt_pkg.*
    apt_pkg.cpython-36m-x86_64-linux-gnu.so
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建符号链接:

    sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.cpython-37m-x86_64-linux-gnu.so 
    
    Run Code Online (Sandbox Code Playgroud)


小智 10

就我而言,我运行了以下命令并修复了错误:

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


小智 7

如果您使用的是 python 3.7,则通过更新 Alternatives 将其降级为 python 3.6,这对我有用

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

sudo update-alternatives --config python3
Run Code Online (Sandbox Code Playgroud)


Jam*_*ate 5

由于某种原因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

我不确定我的升级是否中断,或者为什么会这样。尝试升级后发生(精确-> raring->量化升级)


小智 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 版本,也可以使用上述方法。