Linux上使用Python3.6追溯的ModuleNotFoundError

时间:2017-01-18 13:21:33

标签: python-3.x exception-handling python-3.6

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

最后,问题以评论

结束
  

是的,这似乎是供应商的故障报告基础架构   那是失败的。为什么他们想要报告每一次回溯   交互式提示超出了我的范围,但它似乎就是这样   试图做。

我现在的问题是:

  1. 我如何解释此评论?在这种情况下,Jonathon Fernyhough的PPA是供应商吗?他是否将某些内容更改为他分发的Python代码,以便它尝试为每个产生回溯的Exception提交报告?
  2. 我需要通知谁或者我需要在哪里提交错误才能解决此问题?

4 个答案:

答案 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)

如果大多数投票重播对您不起作用,请尝试以下步骤(请记住更改 [版本] ):

  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别忘了:输入您的[版本]

答案 3 :(得分:0)

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

sudo apt-get remove --purge python3-apt
sudo apt-get install python3-apt