这是我正在处理的项目的追溯:
/usr/lib/python3/dist-packages/apport/report.py:13: PendingDeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
import fnmatch, glob, traceback, errno, sys, atexit, locale, imp
Traceback (most recent call last):
...
File "./mouse16.py", line 1050, in _lit_string
rangeof = range(self.idx.v, self.idx.v + result.span()[1])
AttributeError: 'NoneType' object has no attribute 'span'
现在,我的代码中存在一个自定义错误,导致回溯本身;不管。
我对第一行感兴趣:PendingDeprecationWarning
代表非我的代码。我使用Ubuntu(从apport
可以看出路径中存在),这是众所周知的包装和依赖Python的许多事情,特别是包管理和错误报告({{1} } / apport
)。
imp
is indeed deprecated: "Deprecated since version 3.4: The imp package is pending deprecation in favor of importlib."。我的机器至少运行Python 3.4.3+或更高版本,完全现代化和更新软件需要花费大量时间和大量工作,所以这个警告是可以理解的。
但是my program并没有靠近 ubuntu-bug
,imp
或importlib
,所以我的问题是,为什么不是警告来自apport
的来源写入apport
的日志,或者apport
在stderr
的父进程上确实收集了什么?
如果我不得不对此进行猜测,那是因为开发人员决定缓冲 - 但从不刷新也不写 - apport
的{{1}},所以下一次apport
1}}系统上的子进程打开stderr
进行写入(作为我程序中的错误),apport的缓冲python
也被写入。
我(我想)对Unix的了解不支持 - 为什么两个单独的Python实例会以这种方式进行交互?
根据要求,这是我能为MCVE做的最好的事情:模块级导入列表。
stderr
是因为我导入了stderr
吗?但是......我仍然没有触及import readline
import os
import sys
import warnings
import types
import typing
。
我认为这个问题更具主题性,并且在这里得到的答案比AskUbuntu或Unix & Linux更好;如果您有强烈的反感,请将其标记为迁移,但我认为这些mod会与我达成一致。
答案 0 :(得分:2)
所以我的问题是,为什么不是从apport的源写入apport的日志或者stderr在apport的父进程上收集的警告?
这里的apport python库没有在单独的进程中运行。当然,实际的apport进程是独立的,但是您正在与代码/进程本地的库进行交互/绑定。
由于这个Python库使用的是一个已弃用的模块,它在您的进程内部运行,因此Python正确地警告您。
根据Andrew的回答,apport库会被一个未捕获的异常自动调用。
答案 1 :(得分:2)
如果... e。 G。打包的Python应用程序引发未捕获的异常,自动调用apport后端
Ubuntu分发的Python副本已经过专门修改,可以做到这一点。异常处理已被修改/挂钩,并且在引发异常时调用的代码会触发此警告。