我是 Debian 用户,我想安装 python-dev,但是当我以根用户身份运行 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
问题似乎是什么,我该如何解决?
我在做sudo apt-get update
时遇到了这个问题。我的环境是debian8,python2.7 + 3.4(默认)+ 3.5。
以下代码只会为 python 3.5 重新创建一个apt_pkg....so
文件
sudo apt-get install python3-apt --reinstall
以下代码解决了我的问题:
- 转到
dist-packages
cd /usr/lib/python3/dist-packages
- 找到系统上安装的 python 版本的相应
.so
文件:
ls -l | grep apt_pkg
- 创建一个符号链接:
sudo ln -s apt_pkg.cpython-{your-version-number}-x86_64-linux-gnu.so apt_pkg.so
- 适当地替换
{your-version-number}
。
警告,以下内容将创建从apt_pkg37m到apt_pkg36m的符号链接。确保您链接到正确的版本,或者至少链接到现有版本ls apt_pkg.cpython-*
,并查看您安装了哪个(s)。
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
通过这个来解决它:
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
尝试获得正确的名称。
在我尝试从死蛇存储库安装 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
确保你有一个有效的python-apt包。您可以尝试删除并再次安装该软件包,以解决找不到 apt_pkg.so 的问题。
apt-get install python-apt
当较新版本的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版本。因此,如果我们在 3.6 位系统上安装了 python64,那么 apt_pkg .所以链接将是
sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
但问题在于,当我们安装较新的python版本时,链接将更新为指向最新的python版本,这会导致找不到apt_pkg模块的错误。 通过检查您的发行版附带的 python 版本,您可以创建如上所示的链接。 或者我们使用一种方法为命令提供 python 版本的选择来链接 .所以如;
sudo ln -s apt_pkg.cpython-{36m,35m,34m}-x86_64-linux-gnu.so apt_pkg.so
因为 python 将创建这个指向最新安装的 python 版本的链接,所以我们为命令提供了从 3 个 python 版本中进行选择的选项,其中它将选择给定的最高版本。
我看到每个人都在说如何通过奇怪的复制等方式修复它,但没有人真正说为什么会出现这个问题。
因此,让我解释一下,因为像我这样的人不想仅仅因为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 中不起作用的旧语法元素,则该应用程序将无法运行。
[我的终端以这种方式损坏,因为我使用的是终结者,它显然是用 Python2.7 编写的,与 Python3 不兼容。
这里提供的解决方案建议复制/链接apt包文件或更改python3
链接。
让我们分析一下两者:
- 复制/链接 apt 包
这应该不是问题,因为从 Python3.4 左右开始,所有 python 脚本也可以在较新版本上运行。
迄今。但它可能会在未来中断 - 如果你保持你的系统足够长的时间。
- 更改
python3
链接
这是一个很好的解决方案,因为我们可以回到"永远不要改变链接">
"但我喜欢只打python
!">- 我也喜欢!这就是我最初解决这个问题的方式!
通常,应避免手动更改系统链接 - 改用
update-alternatives
链接不同的版本。这适用于具有多个版本的任何应用。这仍然会破坏这些系统脚本(因为它确实会更改链接),但您可以轻松地来回切换,而不必担心是否将链接和 dest 按正确的顺序放置或输入错误。考虑使用
python
/python3
以外的其他名称作为链接或别名。或者将您自己的
python
/python3
链接添加到PATH(就像虚拟环境一样),而无需更改系统链接。
在 ubuntu18.04 上更新 python3.7 后,这对我有用
cd /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
@user8178061的解决方案运行良好,但我对我的版本进行了一些修改,这些版本与 Ubuntupython3.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 版本:
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
如果您使用的是python 3.7,请通过更新替代方案将其降级到Python 3.6,这对我有用
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
sudo update-alternatives --config python3
就我而言,我运行以下命令,它修复了错误:
sudo apt install --reinstall python3 python python3-minimal --fix-broken
由于某种原因,我的安装丢失了 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
我不确定我的升级是否中断或为什么会这样。它发生在尝试升级(精确>>数量升级)之后
最后的手段是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 版本,也可以mv
上述cp
。
我在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
如果您使用的是python 3.5,请降级到3.4。这是最安全的举动。
在/usr/lib/python3/dist-packages
下,您将看到 Python 3.5 不能使用的*34m*
。 扎扎回答符号链接到它。
除了为apt_pkg.so
做一个符号链接外,你可能想用同样的apt_pkg.so
方式做apt_inst.so
。
ln -s apt_inst.cpython-35m-x86_64-linux-gnu.so apt_inst.so
我试图创建链接,但发生了许多其他问题。因此,您可以选择旧版本的python来安装东西:
sudo update-alternatives --config python3
并在使用相同的命令后立即返回到所需的版本。 希望它有效。
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
花了 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
现在您可以重试,它应该可以工作。
这个变体对我有用。
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
没有一个答案对我有用(我使用的是 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">
就是这样!
好吧,对我来说,最干净的解决方案是在其特定空间中使用新的 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-properties
、python-launchpadlib
等)也这样做了,现在add-apt-repository
就像一个魅力。
要重新编译哪些?只需注意跑步add-apt-repository
的抱怨。
顺便说一下,我在Ubuntu 21.04
,但逻辑在任何类似 Debian 的系统上都是相同的。
请查看以下文档。
它可以帮助您解决问题。
解决用 ModuleNotFoundError 替换 python 版本的问题:没有名为 'apt_pkg' 的模块
请尝试通过设置区域设置变量来解决此问题:
export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
以防万一它对另一个人有帮助,我终于解决了这个问题,这显然是由python版本冲突引起的,通过重定向链接python3,然后将其重定向到正确的python版本:
sudo rm /usr/bin/python3
sudo ln -s /usr/bin/python3.4
您可能需要输入正确的 python 版本,找到:
python3 -V