【发布时间】: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 不会去任何地方靠近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 或Unix & Linux 更贴近主题,并且会在这里得到更好的答案;如果您有强烈的感觉,请将其标记为迁移,但我认为模组会同意我的观点。
【问题讨论】:
-
你能澄清一下你真正问的是什么吗?
-
警告发生在 Python 进程导入的
apport客户端库中,而不是服务器进程中。 -
我在问什么不清楚?我想知道为什么警告会出现在我的代码的回溯中,并且我以两种不同但相似的方式恰好两次提出了这个问题——答案可以选择一个或两个,也可以一个都没有。
-
@ColonelThirtyTwo 为什么 Python 的 runner 需要在运行时导入 apport 呢?这让我更加困惑。
-
我认为当追溯的其余部分无关紧要时,这个问题更有意义,但无论如何¯_(ツ)_/¯
标签: python linux python-3.x deprecation-warning