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

时间:2012-12-04 17:07:20

标签: python linux installation debian

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

# 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

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

23 个答案:

答案 0 :(得分:71)

我在执行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
sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.so
显然,python3-apt检查最高的python版本,而不是当前正在使用的python版本。

答案 1 :(得分:61)

解决这个问题:

/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来尝试获得正确的名称。

答案 2 :(得分:42)

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

apt-get install python-apt

答案 3 :(得分:10)

这在更新ubuntu18.04上的python3.7之后为我工作了

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

答案 4 :(得分:7)

当同时安装了新版本的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依赖于不同的库或共享的对象/库,因此正如其他答案所指出的,我们需要链接。所以到正确的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版本中选择的选项,它将选择给定的最高版本。

答案 5 :(得分:6)

  1. 检查您的默认Python 3版本:
python --version
Python 3.7.5
  1. cd进入/usr/lib/python3/dist-packages,并检查apt_pkg.*文件。您会发现默认Python版本没有任何内容:
ll apt_pkg.*
apt_pkg.cpython-36m-x86_64-linux-gnu.so
  1. 创建符号链接:
sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.cpython-37m-x86_64- linux-gnu.so 

答案 6 :(得分:5)

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

我不确定我的升级是否被破坏或者为什么会出现这种情况。它在尝试升级后发生(精确 - > raring-&gt;量子升级)

答案 7 :(得分:4)

如果你使用的是python 3.5,请降级到3.4。这是最安全的举措。

/usr/lib/python3/dist-packages下,您会看到*34m*哪个python 3.5无法使用。 zhazha回答符号链接。

答案 8 :(得分:3)

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

所以让我解释一下,对于像我这样的人,不想仅仅因为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软件包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(就像虚拟环境一样),而无需更改系统链接。

答案 9 :(得分:2)

如果您使用的是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

答案 10 :(得分:2)

@user8178061的解决方案效果很好,但是我对Ubuntu的python3.7版本进行了一些修改

我将apt_pkg.cpython-3m-i386-linux-gnu.so替换为apt_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

答案 11 :(得分:2)

不得已是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

答案 12 :(得分:1)

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

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

答案 13 :(得分: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

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

答案 14 :(得分:0)

在我尝试从Deadsnakes存储库中安装Python3.7之后,在Ubuntu 18.04.2上发生了这种情况。

解决方法是这个 1)光盘/ usr / lib / python3 / dist-packages / 2)sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so

答案 15 :(得分:0)

请尝试通过设置区域设置变量来解决此问题:

export LC_ALL="en_US.UTF-8"

export LC_CTYPE="en_US.UTF-8"

答案 16 :(得分:0)

Windows 10 WSL v1(Ubuntu 16.04.6 LTS)

reddit answer(稍作修改对我有用)

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

答案 17 :(得分:0)

请查看以下文档。肯定会解决问题。 http://www.programmersought.com/article/55001874709/

答案 18 :(得分: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”

就是这样!

答案 19 :(得分:0)

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

答案 20 :(得分:0)

这个变体对我有用。

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

答案 21 :(得分:0)

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

 ^IT [0-9]{1,5}\/(?:19|20)\d{2}\((?:MN|[HB-EGKMUNLSTV])\)

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

答案 22 :(得分:-3)

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

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

您可能需要输入正确的python版本,找到:

python3 -V