Bio*_*eek 12 exception-handling python-3.x python-3.6
我使用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
Run Code Online (Sandbox Code Playgroud)
我使用新的文字字符串插值创建了一个字符串,但是我提供了一个无效的格式说明符.我不仅得到了预期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
Run Code Online (Sandbox Code Playgroud)
我向Python bug跟踪器报告了此情况.有人指出:
似乎供应商的问题不是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
>>>
Run Code Online (Sandbox Code Playgroud)
另请参阅https://bugs.launchpad.net/ubuntu/+source/python3.6/+bug/1631367.
最后,问题以评论结束
是的,这似乎是供应商失败的报告基础设施失败.为什么他们想要在交互式提示下为每个回溯报告都超出我的范围,但这似乎是他们想要做的事情.
我现在的问题是:
and*_*eas 30
我通过首先安装Python 3的python-apt包解决了Python 3.6的这个问题:
sudo apt install python3-apt
Run Code Online (Sandbox Code Playgroud)
之后,我切换到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
Run Code Online (Sandbox Code Playgroud)
现在所有ModuleNotFoundError: No module named 'apt_pkg'异常都会在预期抛出的错误消息上消失.
Bio*_*eek 13
在我向Stackoverflow发布此问题后,Barry A. Warsaw 对问题跟踪器发表了以下评论
请理解从随机PPA安装Python 3.6并 不能完全支持此版本的解释器.Python 3.6在任何版本的Ubuntu中都不是受支持的版本(我假设你使用它),尽管我们正在为17.04开发它.
通常,您可以安装新的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支持版本的持续工作的更好地方.
如果投票最多的答案不适合您,请尝试以下步骤(请记住您必须更改[版本]):
sudo apt install python3-aptcd /usr/lib/python3/dist-packagesls的正确版本apt_pkg.cpython-[version]-i386-linux-gnu.so35msudo 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.sosudo cp apt_pkg.cpython-[version]-i386-linux-gnu.so apt_pkg.so不要忘记:输入您的[版本]| 归档时间: |
|
| 查看次数: |
17706 次 |
| 最近记录: |