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


100

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

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


1
看起来像你容易打破IST,当您尝试会发生什么的apt-get安装的python-dev的
皮埃尔·盖尔

当我尝试使用apt-get install python-dev时,它说它已经安装:正在读取软件包列表...完成构建依赖关系树读取状态信息...已完成python-dev已经是最新版本。0已升级,0新安装,0已删除和0未升级。还有其他建议吗?
Belphegor,2012年

Answers:


64

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

apt-get install python-apt

已安装。当我命中时:#apt-get install python-apt它给了我阅读包列表...完成的依赖关系树读取状态信息...完成的python-apt已经是最新版本。0已升级,0新安装,0已删除和0未升级。当我再次尝试:#aptitude install python-dev它再次给我同样的错误。其他一些想法我该怎么办?
Belphegor

14
使用删除apt-get remove --purge python-apt并重新安装
Arnestig

8
注意其他依赖项。我在Ubuntu中迅速删除了该软件包,并且也删除了许多其他依赖项(例如ubuntu-desktop)。但是,我不注意日志中的注释是我的错。
Al R.

1
不太确定是否是由于python-apt造成的。查看packages.ubuntu.com/lucid/ubuntu-desktop,了解对ubuntu-desktop的依赖性。
Arnestig 2013年

3
@Arnestig删除python-apt听起来很危险!!上过一次课,我不会尝试。
alvas '16

143

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

以下代码将仅为apt_pkg....sopython 3.5重新创建文件

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版本。


29
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
desaiankitb

39
你真厉害!对我来说,这是sudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.so针对python3.6的,这个可怕的错误现在消失了。
亚历克斯·古罗拉

56
安装Python 3.7在Ubuntu 18.04旁边默认3.6与之后sudo apt install python3.7我得到这个apt_pkg错误尝试运行点子,所以我需要运行cd /usr/lib/python3/dist-packages,然后sudo ln -s apt_pkg.cpython-{36m,37m}-x86_64-linux-gnu.sosudo apt install python3-pip
阿布卡

3
对于python 3.6,命令将为sudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.so
StatguyUser

1
这些花括号不是ln命令的属性。他们调用外壳支撑扩展,请参阅gnu.org/software/bash/manual/html_node/Brace-Expansion.html
Carlos A. Ibarra

116

通过以下方法解决:

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


完美工作
Subhrajyoti Sen

3
在Ubuntu 18.04上,使用此$ cd / usr / lib / python3 / dist-packages $ sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
Naren Yellavula

这对我也很有效...我在上列出了所有文件/usr/lib/python3/dist-packages,发现没有apt_pkg.cpython-34m-i386-linux-gnu.soapt_pkg.cpython-3m-i386-linux-gnu.so,但是我有apt_pkg.cpython-36m-i386-linux-gnu.so...我将此文件复制到apt_pkg.so并可以正常工作!谢谢!
莱昂纳多·伊索

这也为我工作。就像@LeonardoIsso一样,我也列出了所有文件以找到正确的文件名,因为我使用的是32位Linux。
w3开发

66

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


3
只是想向其他人确认这确实对我有用。
AnthonyD973

2
太疯狂了,谢谢!在码头上时: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
loretoparisi

2
是的,那是解决方案:)
szedjani

1
这是解决方案!升级到python 3.7之后。
JOHN

1
04年4月18日,升级到python 3.7,这也对我有用!谢谢!!
RJaus

22

当同时安装了新版本的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版本中进行选择的选项,它将选择给定的最高版本。


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

16

@ 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


1
这解决了我的问题。如果它是由将Python版本从3.6切换到3.7引起的,则可以解决此问题。
jumbot

1
谢谢,有同样的问题!考虑使用,sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so这样很清楚apt_pkg.so
Scipio

工作,但sudo cp apt_pkg.cpython-37m-x86_64-linux-gnu.so apt_pkg.so由于某种原因我不得不将其更改为
丹尼尔(Daniel)

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

1
在ubuntu18.04上升级python 3.8后,这对我有用。
亨利·帕拉西奥斯

6

由于某种原因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->定量升级)


这对我来说是正确的解决方法。尽管我知道这是一个坏主意,但我还是通过将pip3用作root引起了这个问题。我想看看如果将手指放在电灯插座中会给我带来多大的震撼。答案是:非常糟糕。同样,弄乱/ etc / alternatives设置也不是冒牌的。不适用于兼职访客。我认为跨越python链接指向的是哪个python问题,这使我开始走向灾难。
pauljohn32 '20

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 

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


5

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

这在python3.6上对我有用,但是当我恢复为python3.7时,错误仍然存​​在
Hugo Sohm

3

如果您使用的是Python 3.5,请降级为3.4。这是最安全的举动。

在下面,/usr/lib/python3/dist-packages您将看到*34m*不能使用哪个python 3.5。zhazha回答了它的符号链接。


您如何降级?
朋奇亚

为什么降级是最安全的肌动蛋白?
大卫·麦迪内斯

3

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

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

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 package python-apt/python3-apt是系统软件包,因此它是默认系统python

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


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

[我的终端打破了这种方式,因为我使用了终结者,终结者显然是用Python2.7编写的,与Python3不兼容。]


这里介绍的解决方案建议复制/链接apt软件包文件或更改python3链接。

让我们分析一下:

  1. 复制/链接apt包

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

至今。但是,如果您将系统保留足够长的时间,将来可能会中断。

  1. python3回链接

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


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

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

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

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


对新的python用户非常有帮助。
哈桑·阿贾兹



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”

而已!


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

1
看来该解决方案已在针对该问题的至少6个其他答案中提出(另外3个建议复制文件而不是符号链接)。
谢尔盖·舒宾

这只是为我工作,谢谢!一件事是在此之前,我们需要cd / usr / lib / python3 / dist-packages
郝黄

-3

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

export LC_ALL="en_US.UTF-8"

export LC_CTYPE="en_US.UTF-8"

1
尝试更加具体,并解释这两个命令的作用。
dpapadopoulos

-5

以防万一,这终于解决了这个问题,这显然是python版本冲突所致,方法是重定向链接python3,然后将其重定向到正确的python版本:

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

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

python3 -V

2
删除python3是一个坏主意:(如果您想链接到python 3.4,请使用:ln -s /usr/bin/python3.4 / usr / bin / python3
Pamungkas Jayuda

1
告诉人们除非确实需要,否则从那里删除系统从来不是一个好主意。幸运的是,/ usr / bin / python3通常只是一个符号链接。我真的认为您应该删除此答案。
Jamie Lindsey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.