为什么 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 impimportlibapport,所以我的问题是,为什么来自 apport 的来源的警告没有写入 apport 的日志,或者肯定没有被 stderrapport 的父进程上收集?

如果我不得不对此进行猜测,那是因为开发人员决定缓冲——但从不刷新或写入——apportstderr,所以下一次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,导致异常时调用的代码会触发此警告。