为什么 Python 运行时以这种方式处理警告?
Why does the Python runtime handle warnings this way?
这是我正在进行的项目的回溯:
/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'
现在,我的代码中有一个 since-fixed 错误导致了回溯本身;随便。
我对第一行感兴趣:PendingDeprecationWarning
表示不是我的代码。我使用 Ubuntu(从 apport
在路径中的存在可以看出),它以打包和依赖 Python 做很多事情而闻名,尤其是包管理之类的事情和错误报告 (apport
/ ubuntu-bug
)。
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 哪儿也去不了 near imp
、importlib
或 apport
,所以我的问题是,为什么来自 apport
的来源的警告没有写入 apport
的日志,或者肯定没有被 stderr
在 apport
的父进程上收集?
如果我不得不对此进行猜测,那是因为开发人员决定缓冲——但从不刷新或写入——apport
的 stderr
,所以下一次python
系统上的子进程打开 stderr
进行写入(作为我程序中的错误),apport 的缓冲 stderr
也被写入。
我(认为我)对 Unix 的了解不支持这一点——为什么两个单独的 Python 实例会以这种方式交互?
根据要求,这是我能为 MCVE 做的最好的事情:模块级导入列表。
import readline
import os
import sys
import warnings
import types
import typing
难道是因为我导入了warnings
?但是……我还是不碰apport
.
我认为这个问题比 AskUbuntu or Unix & Linux 更切合主题,并且会在 SO 上得到更好的答案;如果您强烈反对,请将其标记为迁移,但我认为模组会同意我的意见。
so my question is, why isn't a warning deriving from apport's source written to apport's logs or certainly collected by stderr on apport's parent process?
apport python 库不在此处的单独进程中 运行。当然,实际的批准过程是分开的,但是您 interacting/binding 使用您 code/process.
本地的图书馆
由于此 Python 库使用了一个已弃用的模块,即在您的进程中 运行,Python 正确警告您。
根据 Andrew 的回答,apport 库会自动调用并出现未捕获的异常。
Apport docs状态:
If ... e. g. a packaged Python application raises an uncaught exception, the apport backend is automatically invoked
由 Ubuntu 分发的 Python 的副本已专门修改为执行此操作。 exception-handling 已变为 modified/hooked,导致异常时调用的代码会触发此警告。
这是我正在进行的项目的回溯:
/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'
现在,我的代码中有一个 since-fixed 错误导致了回溯本身;随便。
我对第一行感兴趣:PendingDeprecationWarning
表示不是我的代码。我使用 Ubuntu(从 apport
在路径中的存在可以看出),它以打包和依赖 Python 做很多事情而闻名,尤其是包管理之类的事情和错误报告 (apport
/ ubuntu-bug
)。
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 哪儿也去不了 near imp
、importlib
或 apport
,所以我的问题是,为什么来自 apport
的来源的警告没有写入 apport
的日志,或者肯定没有被 stderr
在 apport
的父进程上收集?
如果我不得不对此进行猜测,那是因为开发人员决定缓冲——但从不刷新或写入——apport
的 stderr
,所以下一次python
系统上的子进程打开 stderr
进行写入(作为我程序中的错误),apport 的缓冲 stderr
也被写入。
我(认为我)对 Unix 的了解不支持这一点——为什么两个单独的 Python 实例会以这种方式交互?
根据要求,这是我能为 MCVE 做的最好的事情:模块级导入列表。
import readline
import os
import sys
import warnings
import types
import typing
难道是因为我导入了warnings
?但是……我还是不碰apport
.
我认为这个问题比 AskUbuntu or Unix & Linux 更切合主题,并且会在 SO 上得到更好的答案;如果您强烈反对,请将其标记为迁移,但我认为模组会同意我的意见。
so my question is, why isn't a warning deriving from apport's source written to apport's logs or certainly collected by stderr on apport's parent process?
apport python 库不在此处的单独进程中 运行。当然,实际的批准过程是分开的,但是您 interacting/binding 使用您 code/process.
本地的图书馆由于此 Python 库使用了一个已弃用的模块,即在您的进程中 运行,Python 正确警告您。
根据 Andrew 的回答,apport 库会自动调用并出现未捕获的异常。
Apport docs状态:
If ... e. g. a packaged Python application raises an uncaught exception, the apport backend is automatically invoked
由 Ubuntu 分发的 Python 的副本已专门修改为执行此操作。 exception-handling 已变为 modified/hooked,导致异常时调用的代码会触发此警告。