1

这是我正在从事的项目的回溯:

/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'

现在,我的代码中有一个已修复的错误导致回溯本身;任何。

我对第一行感兴趣:PendingDeprecationWarningfor not-my-code。我使用 Ubuntu(从路径中的存在可以看出apport),它以打包和依赖 Python 做很多事情而闻名,特别是包管理和错误报告 ( apport/ ubuntu-bug) 之类的事情。

imp确实已弃用:“自 3.4 版以来已弃用:imp 包正在等待弃用,以支持 importlib。” . 我的机器至少运行 Python 3.4.3+ 或更高版本,完全现代化和更新软件需要时间和大量工作,所以这个警告是可以理解的。

但是我的程序并没有靠近 impimportlib或者apport,所以我的问题是,为什么来自apport' 源的警告没有写入' 的日志或肯定由on的父进程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更贴近主题,并且会在 SO 上得到更好的答案;如果您有强烈的感觉,请将其标记为迁移,但我认为模组会同意我的观点。

4

2 回答 2

2

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

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

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

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

于 2016-01-17T18:26:14.630 回答
2

Appport文档状态:

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

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

于 2016-01-17T18:35:35.540 回答