【问题标题】:Why does the Python runtime handle warnings this way?为什么 Python 运行时会以这种方式处理警告?
【发布时间】:2016-01-17 18:16:20
【问题描述】:

这是我正在从事的一个项目的追溯:

/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 表示 not-my-code。我使用 Ubuntu(从路径中的apport 可以看出),它以打包和依赖 Python 做很多事情而闻名,尤其是包管理和错误报告(apport / @987654329 @)。

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 不会去任何地方靠近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


我认为这个问题比AskUbuntuUnix & Linux 更贴近主题,并且会在这里得到更好的答案;如果您有强烈的感觉,请将其标记为迁移,但我认为模组会同意我的观点。

【问题讨论】:

  • 你能澄清一下你真正问的是什么吗?
  • 警告发生在 Python 进程导入的 apport 客户端库中,而不是服务器进程中。
  • 我在问什么不清楚?我想知道为什么警告会出现在我的代码的回溯中,并且我以两种不同但相似的方式恰好两次提出了这个问题——答案可以选择一个或两个,也可以一个都没有。
  • @ColonelThirtyTwo 为什么 Python 的 runner 需要在运行时导入 apport 呢?这让我更加困惑。
  • 我认为当追溯的其余部分无关紧要时,这个问题更有意义,但无论如何¯_(ツ)_/¯

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


【解决方案1】:

Apport docs 状态:

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

Ubuntu 分发的 Python 副本已被专门修改为执行此操作。异常处理已被修改/挂钩,当您引发异常时调用的代码会触发此警告。

【讨论】:

  • ...我的代码实际上不是packaged,但这更有意义。
  • 查看source,似乎每个异常都会调用 Appport 异常处理程序,然后如果它确定它正在记录/报告的 Ubuntu 打包程序中运行崩溃。
【解决方案2】:

所以我的问题是,为什么来自 apport 的源的警告没有写入 apport 的日志或肯定由 stderr 在 apport 的父进程上收集?

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

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

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

【讨论】:

  • 什么?我的代码在哪里与apport 或它自己的运行时之外的任何东西交互?
猜你喜欢
  • 2021-07-19
  • 2011-12-05
  • 2020-04-07
  • 2014-08-28
  • 1970-01-01
  • 2021-12-20
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多