为什么Python运行时以这种方式处理警告?

时间:2016-01-17 18:16:20

标签: python linux python-3.x deprecation-warning

这是我正在处理的项目的追溯:

/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-bugimpimportlib,所以我的问题是,为什么不是警告来自apport的来源写入apport的日志,或者apportstderr的父进程上确实收集了什么?

如果我不得不对此进行猜测,那是因为开发人员决定缓冲 - 但从不刷新也不写 - apport的{​​{1}},所以下一次apport 1}}系统上的子进程打开stderr进行写入(作为我程序中的错误),apport的缓冲python也被写入。

我(我想)对Unix的了解不支持 - 为什么两个单独的Python实例会以这种方式进行交互?

根据要求,这是我能为MCVE做的最好的事情:模块级导入列表。

stderr

是因为我导入了stderr吗?但是......我仍然没有触及import readline import os import sys import warnings import types import typing

我认为这个问题更具主题性,并且在这里得到的答案比AskUbuntuUnix & Linux更好;如果您有强烈的反感,请将其标记为迁移,但我认为这些mod会与我达成一致。

2 个答案:

答案 0 :(得分:2)

  

所以我的问题是,为什么不是从apport的源写入apport的日志或者stderr在apport的父进程上收集的警告?

这里的apport python库没有在单独的进程中运行。当然,实际的apport进程是独立的,但是您正在与代码/进程本地的库进行交互/绑定。

由于这个Python库使用的是一个已弃用的模块,它在您的进程内部运行,因此Python正确地警告您。

根据Andrew的回答,apport库会被一个未捕获的异常自动调用。

答案 1 :(得分:2)

Apport docs州:

  

如果... e。 G。打包的Python应用程序引发未捕获的异常,自动调用apport后端

Ubuntu分发的Python副本已经过专门修改,可以做到这一点。异常处理已被修改/挂钩,并且在引发异常时调用的代码会触发此警告。