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

2024-10-18 09:00:00
admin
原创
82
摘要:问题描述:我是 Debian 用户,我想安装 python-dev,但是当我以 root 身份在 shell 中运行代码时:# aptitude install python-dev 我收到以下错误:Traceback (most recent call last): File &q...

问题描述:

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

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

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

sudo apt-get install python3-apt --reinstall

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

  1. 转至dist-packages

cd /usr/lib/python3/dist-packages
  1. 找到适合.so您系统上安装的 Python 版本的文件:

ls -l | grep apt_pkg
  1. 创建符号链接:

sudo ln -s apt_pkg.cpython-{your-version-number}-x86_64-linux-gnu.so apt_pkg.so
  1. 适当更换{your-version-number}

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

sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.so apt_pkg.so

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

要了解为什么会发生这种情况,请参阅下面的答案:https://stackoverflow.com/a/64241654/21539

解决方案 2:

用这个方法解决:

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

解决方案 3:

在我尝试从 deadsnakes repo 安装 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:

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

apt-get install python-apt

解决方案 5:

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

所以让我解释一下,对于那些像我一样不想弄乱系统文件的人,只是因为 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(就像虚拟环境一样),而不更改系统链接。

解决方案 6:

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

解决方案 7:

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

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

解决方案 8:

@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

解决方案 9:

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

python3 --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 

解决方案 10:

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

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

解决方案 11:

如果你正在使用 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

解决方案 12:

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->量子升级)

解决方案 13:

最后的手段是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命令对你来说太多或者以某种方式神奇地不起作用。

cp`mv`如果您只致力于使用一个 Python 版本,则上述方法也可以。

解决方案 14:

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

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

解决方案 15:

我在 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.4apt_pkg.cpython-34m-x86_64-linux-gnu.so 创建以下符号链接来修复此错误

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

解决方案 16:

我尝试创建链接,但出现了许多其他问题。因此,您可以选择旧版本的 Python 来安装:

sudo update-alternatives --config python3

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

解决方案 17:

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

下面/usr/lib/python3/dist-packages你会看到*34m*哪个 python 3.5 不能使用。zhazha 回答符号链接到它。

解决方案 18:

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

解决方案 19:

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

重要的是要理解,有时当你从旧的 Python 版本升级时,一些包会保留在以前的版本路径中,因此我做了以下事情:

cd /usr/lib/python3/dist-packages

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

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

解决方案 20:

这个变体对我有用。

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:

这些答案都不适合我(我使用的是 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”

就是这样!

解决方案 22:

嗯,对我来说最干净的解决方案是在特定空间中使用新的 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 的系统上逻辑都是相同的。

解决方案 23:

请查看以下文档。

它可以帮助你解决问题。

解决更换python版本出现ModuleNotFoundError: No module named 'apt_pkg'的问题

解决方案 24:

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

export LC_ALL="en_US.UTF-8"

export LC_CTYPE="en_US.UTF-8"

解决方案 25:

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

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

您可能需要输入正确的 Python 版本,可以使用以下命令找到:

python3 -V
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用