15

我使用Jonathon Fernyhough 的 PPA在 Ubuntu 16.04 上安装了 Python 3.6

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 错误跟踪器。那里注意到:

这似乎是供应商的问题,而不是 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

最后,这个问题被评论关闭了

是的,这似乎是供应商的故障报告基础设施出现故障。为什么他们想要在交互式提示下的每个回溯报告都超出了我的范围,但这似乎是他们正在尝试做的事情。

我现在的问题是:

  1. 我如何解释这条评论?在这种情况下,供应商是 Jonathon Fernyhough 的 PPA 吗?他是否对他分发的 Python 代码进行了一些更改,以便它尝试为每个产生回溯的异常提交报告?
  2. 我需要通知谁或者我需要在哪里提交错误来解决这个问题?
4

4 回答 4

34

我通过首先为 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'异常都在预期抛出的错误消息上消失了。

于 2018-04-17T14:46:13.953 回答
14

在我将这个问题发布到 Stackoverflow 后,Barry A. Warsaw对问题跟踪器发表了以下评论

请理解,从随机 PPA 安装 Python 3.6 并不 完全支持此版本的解释器。尽管我们正在为 17.04 开发 Python 3.6,但在任何版本的 Ubuntu(我假设您正在使用)中,Python 3.6 都不是受支持的版本。

很多时候,你可以安装一个新的 Python 3 解释器包,因为 Ubuntu 基础设施在所有已安装的 Python 3 中共享纯 Python 模块,所以很多事情都会起作用。从技术上讲,它们都将在其 sys.path 上有 /usr/lib/python3/dist-packages,因此为 Python 3 的支持版本构建的任何第三方纯 Python 模块都可以通过任何(包构建的)安装版本导入Python 3 的。

但是 1) 说这些第三方模块可以工作还有很长的路要走;2) 不包括任何包含 C 扩展模块的包,必须为特定的解释器版本重新构建。

支持新版本的 Python 是一个漫长的过程,我们才刚刚开始。请联系 ubuntu-devel@ubuntu.com 了解详情。

Ubuntu 确实安装了一个标准的异常处理程序,以便当 Python 应用程序和此类崩溃时,我们可以收集崩溃统计信息,以便我们可以将资源用于修复常见问题和回归。apport(您在回溯中看到)是崩溃报告基础设施。apport 调用 apt_pkg,这是一个 (C++) 扩展模块,因此不会为您从该 PPA 安装的 Python 3.6 版本构建,除非 PPA 所有者(我不知道)当然也做了归档范围的 Python 3 重建。由于我正在设置它,而且我知道这是一项相当多的工作,我怀疑这个相当随机的 PPA 是否已经完成了。

ubuntu-devel 邮件列表是讨论将 Python 3.6 作为 Ubuntu 支持版本进行的工作的更好场所。

于 2017-01-18T14:58:25.867 回答
5

如果大多数投票的答案对您不起作用,请尝试以下步骤(请记住,您必须更改[version]):

  1. 运行这个命令sudo apt install python3-apt
  2. 转到目录cd /usr/lib/python3/dist-packages
  3. 运行ls以找到apt_pkg.cpython-[version]-i386-linux-gnu.so在我的情况下的正确版本35m
  4. 创建符号链接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尝试以下命令:

  1. rm -rf apt_pkg.so
  2. 创建符号链接sudo cp apt_pkg.cpython-[version]-i386-linux-gnu.so apt_pkg.so不要忘记:输入您的 [版本]
于 2019-03-05T21:57:10.320 回答
1

我删除python3-apt了,这似乎已经解决了 Python 3.8

sudo apt-get remove --purge python3-apt
sudo apt-get install python3-apt
于 2019-12-23T16:58:54.903 回答