python-dev安装错误:ImportError: No module named apt_pkg

Posted

技术标签:

【中文标题】python-dev安装错误:ImportError: No module named apt_pkg【英文标题】:python-dev installation error: ImportError: No module named apt_pkg 【发布时间】:2012-11-22 09:22:06 【问题描述】:

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

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

【问题讨论】:

看起来你的 apt ist 坏了,当你尝试 apt-get install python-dev 时会发生什么 当我尝试使用 apt-get install python-dev 时,它说它已经安装了:Reading package lists... Done Building dependency tree Reading state information... Done python-dev is already最新版本。 0 升级,0 新安装,0 删除,0 未升级。还有其他建议吗? 【参考方案1】:

这样解决:

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

【讨论】:

完美运行 在 Ubuntu 18.04 上,使用这个 $ cd /usr/lib/python3/dist-packages $ sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so 这对我也有用...我列出了/usr/lib/python3/dist-packages 上的所有文件,我看到我没有apt_pkg.cpython-34m-i386-linux-gnu.soapt_pkg.cpython-3m-i386-linux-gnu.so,但我有@ 987654328@...我把这个文件复制到apt_pkg.so 并且工作得很好!谢谢! 这对我也有用。正如@LeonardoIsso 所做的那样,我还列出了所有文件以找到正确的文件名,因为我使用的是 32 位 Linux。【参考方案2】:

我在做sudo apt-get update 时遇到了这个问题。我的环境是 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-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 版本。

【讨论】:

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 你太棒了!对我来说,python3.6 是sudo ln -s apt_pkg.cpython-35m,36m-x86_64-linux-gnu.so,现在这个可怕的错误已经消失了。 在 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 . 对于python 3.6,命令为sudo ln -s apt_pkg.cpython-35m,36m-x86_64-linux-gnu.so 这些大括号不是 ln 命令的属性。他们调用 shell 大括号扩展,参见 gnu.org/software/bash/manual/html_node/Brace-Expansion.html【参考方案3】:

嗯,对我来说最干净的解决方案是在特定空间中使用新的 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-propertiespython-launchpadlib 等)完成此操作,现在 add-apt-repository 就像一个魅力。

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

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

【讨论】:

【参考方案4】:

请查看以下文档。

它可以帮助您解决问题。

Solve the problem of replacing the python version with ModuleNotFoundError: No module named 'apt_pkg'

【讨论】:

请在此处提供答案。您可以复制并粘贴命令并保留链接【参考方案5】:

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

sudo update-alternatives --config python3

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

【讨论】:

【参考方案6】:

    检查您的默认 Python 3 版本:

    python3 --version
    Python 3.7.5
    

    cd 进入 /usr/lib/python3/dist-packages 并检查 apt_pkg.* 文件。你会发现你的默认 Python 版本没有:

    ll apt_pkg.*
    apt_pkg.cpython-36m-x86_64-linux-gnu.so
    

    创建符号链接:

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

【讨论】:

【参考方案7】:

这个变体对我有用。

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

【讨论】:

这对我有用【参考方案8】:

花了 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

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

【讨论】:

【参考方案9】:

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

【讨论】:

看起来这个解决方案已经在这个问题的至少 6 个其他答案中提出(还有 3 个只是建议复制文件而不是符号链接)。 这对我有用,谢谢!一件事是在此之前我们需要 cd /usr/lib/python3/dist-packages【参考方案10】:

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

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

我们来分析一下:

    复制/链接 apt 包

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

到目前为止。但它可能会在未来中断 - 如果您将系统保持足够长的时间。

    python3链接改回

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


“但我喜欢只需要输入python!” - 我也喜欢!我就是这样解决这个问题的!

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

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

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

【讨论】:

对python新用户很有帮助。【参考方案11】:

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

1-连接到服务器的FTP

2- 进入文件夹“/usr/lib/python3/dist-packages/”

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

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

就是这样!

【讨论】:

【参考方案12】:

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

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

【讨论】:

在 ubuntu18.04 上升级 python 3.8 后这对我有用。 这对我来说适用于 Python 3.8.5Ubuntu 20.04;麻烦的原因是玩弄了符号链接 /bin/usr/python 的目标 py2/py3。这使一些调用 py3 的程序感到困惑,从而引发了 OP 的错误。另一个答案***.com/a/64241654/5459638 包含有用的信息以了解发生了什么。【参考方案13】:

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

【讨论】:

【参考方案14】:

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

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

【讨论】:

这解决了我的问题。如果它是由 Python 版本从 3.6 切换到 3.7 引起的,这可以解决问题。 谢谢,遇到了同样的问题!考虑使用sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so,以便清楚apt_pkg.so 是什么。 工作,但由于某种原因我不得不将其更改为sudo cp apt_pkg.cpython-37m-x86_64-linux-gnu.so apt_pkg.so【参考方案15】:

如果您使用 python 3.7 通过更新替代品将其降级到 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 时,错误仍然存​​在【参考方案16】:

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

【讨论】:

只是想向其他人确认这确实对我有用。 这太疯狂了,谢谢!在码头时: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 是的,这就是解决方案:) 这就是解决方案!升级到 python 3.7 后。 18.04.04,升级到 python 3.7,这对我也有用!谢谢!!【参考方案17】:

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

【讨论】:

运行 18.04.2,您的第一个建议对我有用,我终于可以毫无错误地运行 sudo apt-get update。您的第二个建议返回错误,指出 apt-get.so 不是文件夹。【参考方案18】:

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

export LC_ALL="en_US.UTF-8"

export LC_CTYPE="en_US.UTF-8"

【讨论】:

尝试更具体的解释这两个命令的作用。 请在此答案中添加模式详细信息。它对你有用吗?这是为了达到什么目的?【参考方案19】:

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

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

【讨论】:

【参考方案20】:

最后的手段是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

【讨论】:

【参考方案21】:

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

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

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

python3 -V

【讨论】:

删除 python3 是个坏主意 :( 如果你想链接到 python 3.4,请使用:ln -s /usr/bin/python3.4 /usr/bin/python3 除非真的需要,否则告诉人们从系统中删除东西绝不是一个好主意。幸运的是 /usr/bin/python3 通常只是一个符号链接。我真的认为你应该删除这个答案。 至少重新安装更安全...sudo apt install --reinstall python3【参考方案22】:

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

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

【讨论】:

如何降级? 为什么降级最安全的肌动蛋白?【参考方案23】:

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

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

【讨论】:

这对我来说是正确的解决方法。我使用 pip3 作为 root 导致了这个问题,尽管我知道这是一个坏主意。我想看看如果我把手指放在电灯插座里会受到多大的震惊。答案是:很糟糕。弄乱 /etc/alternatives 设置也不是为了装腔作势。不适合任何兼职访客。我认为跨越 python 链接指向哪个 python 是问题,这让我走上了灾难之路。【参考方案24】:

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

apt-get install python-apt

【讨论】:

使用apt-get remove --purge python-apt删除并重新安装 注意其他依赖项。我在 Ubuntu 中也快速删除了该软件包,并且还删除了许多其他依赖项(例如 ubuntu-desktop)。但是,我没有注意日志中的注释是我的错。 不确定是否是由于 python-apt。查看 packages.ubuntu.com/lucid/ubuntu-desktop 以了解对 ubuntu-desktop 的依赖。 @Arnestig 删除python-apt 听起来相当危险!!吸取了一次教训,我不会尝试。 编译python对我有用,这里是链接github.com/pypa/pip/issues/5367#issue-320060428

以上是关于python-dev安装错误:ImportError: No module named apt_pkg的主要内容,如果未能解决你的问题,请参考以下文章

python-dev如何安装 sudo apt-get install python-dev 行不通

python-dev如何安装 sudo apt-get install python-dev ?

无法在 centos 6.5 上安装 python-dev

python-dev安装

python-dev无法安装,求助

python-dev无法安装,求助