我installed Python 3.6 on Ubuntu 16.04使用Jonathon Fernyhough's PPA:
sudo add-apt-repository ppa:jonathonf/python-3.6
sudo apt-get update
sudo apt-get install python3.6
我使用新的文字字符串插值创建了一个字符串,但是我提供了一个无效的格式说明符。我不仅获得了预期的ValueError: Invalid format specifier
,还获得了意外的ModuleNotFoundError: No module named 'apt_pkg'
。
$ python3.6
Python 3.6.0 (default, Dec 29 2016, 21:40:36)
[GCC 5.4.1 20161202] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> value = 4 * 20
>>> f'the value is {value:%A}'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Invalid format specifier
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
from apport.report import Report
File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
import apport.fileutils
File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
from apport.packaging_impl import impl as packaging
File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
import apt
File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
Original exception was:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Invalid format specifier
我向Python bug tracker报告了此情况。有人指出:
似乎供应商的问题不是CPython本身。同样的问题也发生在Ubuntu 16.10的Python 3.6中。提出任何异常都可能导致这种情况:
Python 3.6.0b2 (default, Oct 11 2016, 05:27:10)
[GCC 6.2.0 20161005] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> raise Exception
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Exception
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
from apport.report import Report
File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
import apport.fileutils
File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
from apport.packaging_impl import impl as packaging
File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
import apt
File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
Original exception was:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Exception
>>>
另见https://bugs.launchpad.net/ubuntu/+source/python3.6/+bug/1631367。
最后,问题以评论
结束是的,这似乎是供应商的故障报告基础架构 那是失败的。为什么他们想要报告每一次回溯 交互式提示超出了我的范围,但它似乎就是这样 试图做。
我现在的问题是:
答案 0 :(得分:22)
我通过首先安装Python 3的python-apt包来解决Python 3.6的这个问题:
sudo apt install python3-apt
之后,我更改为dist-packages
目录并将apt_pkg[...].so
文件复制到新的默认文件名apt_pkg.so
,以便Python 3.6也能识别:
cd /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-34m-i386-linux-gnu.so apt_pkg.so
现在所有ModuleNotFoundError: No module named 'apt_pkg'
异常都会在预期抛出的错误消息中消失。
答案 1 :(得分:13)
在我向Stackoverflow发布此问题后,Barry A. Warsaw向问题跟踪器发出以下comment
请理解从随机PPA安装Python 3.6可以 not 为此版本的解释器提供完全支持。在任何版本的Ubuntu中,Python 3.6还不是受支持的版本 (我假设你正在使用它),虽然我们正在努力 17.04。
通常,您可以安装新的Python 3解释程序包 很多东西都可以工作,因为Ubuntu基础设施共享 所有已安装的Python 3中的纯Python模块。技术上 说来,他们都会有/ usr / lib / python3 / dist-packages sys.path所以为支持而构建的任何第三方纯Python模块 任何版本的Python 3都可以导入(包构建) 已安装的Python 3版本。
但是,1)距离说那些第三方模块还有很长的路要走 将工作; 2)不包含任何包含C扩展名的包 模块,必须为特定的解释器版本重建。
支持新版本的Python是一个漫长的过程,我们也是如此 刚开始。请与ubuntu-devel@ubuntu.com联系 的信息。
Ubuntu确实安装了一个标准的异常处理程序,以便在Python时使用 应用程序和这样的崩溃,我们可以收集崩溃统计数据,这样 我们可以投入资源来解决常见问题和回归。 apport(你在追溯中看到的)是崩溃报告 基础设施。 apport调用apt_pkg,这是一个(C ++)扩展 模块因此不会为Python 3.6的版本构建 你是从那个PPA安装的,除非是PPA所有者(我是谁) 不知道)还做了一个归档范围的Python 3重建。因为我 在设置它的过程中,我知道这是相当多的 工作,我怀疑这个相当随机的PPA已经完成了。
ubuntu-devel邮件列表是讨论正在进行的更好的地方 努力将Python 3.6作为Ubuntu支持的版本。
答案 2 :(得分:1)
如果大多数投票重播对您不起作用,请尝试以下步骤(请记住更改 [版本] ):
sudo apt install python3-apt
cd /usr/lib/python3/dist-packages
ls
来查找apt_pkg.cpython-[version]-i386-linux-gnu.so
的正确版本,35m
sudo cp apt_pkg.cpython-[version]-i386-linux-gnu.so apt_pkg.so
别忘了:输入您的[版本] 如果它给您任何错误cp: cannot stat 'apt_pkg.cpython-[your-version]-i386-linux-gnu.so': No such file or directory
,请尝试以下命令:
rm -rf apt_pkg.so
sudo cp apt_pkg.cpython-[version]-i386-linux-gnu.so apt_pkg.so
别忘了:输入您的[版本] 答案 3 :(得分:0)
我删除了python3-apt
,这似乎已经在Python 3.8中解决了
sudo apt-get remove --purge python3-apt
sudo apt-get install python3-apt