Почему среда исполнения Python обрабатывает предупреждения таким образом?

Вот отрывок из проекта, над которым я работаю:

/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 для многих вещей, в частности для управления пакетами и создания отчетов об ошибках (apport / ubuntu-bug).

imp действительно устарела: " устарела с версии 3.4: пакет imp ожидает устаревания в пользу importlib"., Моя машина работает по крайней мере на Python 3.4.3+ или выше, и для полной модернизации и обновления программного обеспечения требуется время и много работы, поэтому это предупреждение понятно.

Но моя программа не идет никуда imp, importlib или же apport, поэтому мой вопрос, почему предупреждение не вытекает из apport Источник написан apport логи или наверняка собранные stderr на apport родительский процесс?

Если мне нужно было сделать предположение, это потому, что разработчики решили создать буфер - но никогда не сбрасывать и не писать - apport"s stderr и так в следующий раз python дочерний процесс в системе открывается stderr для записи (как ошибка в моей программе), apport буферизован stderr тоже написано.

Это не подтверждается тем, что я (думаю, я) знаю о Unix - почему два отдельных экземпляра Python взаимодействуют таким образом?


По запросу вот лучшее, что я могу сделать для MCVE: список импортов на уровне модулей.

import readline
import os
import sys
import warnings
import types
import typing

Это потому что я импортирую warnings? Но... я до сих пор не трогаю apport,


Я думаю, что этот вопрос более тематический и даст лучшие ответы здесь на SO, чем AskUbuntu или Unix & Linux; пометьте его для миграции, если вы чувствуете себя сильно иначе, но я думаю, что моды согласятся со мной.

2 ответа

Решение

В Apport Docs указано:

Если... например, упакованное приложение Python вызывает необработанное исключение, автоматически вызывается серверная часть приложения

Копия Python, распространяемая Ubuntu, была специально модифицирована для этого. Обработка исключений была изменена / перехвачена, и код, который вызывается, когда вы вызываете исключение, вызывает это предупреждение.

поэтому мой вопрос: почему предупреждение, полученное из источника apport, не записано в журналы apport или, конечно, не собрано stderr в родительском процессе apport?

Библиотека Python apport здесь не работает в отдельном процессе. Конечно, фактический процесс apport является отдельным, но вы взаимодействуете с ним или привязываете его к библиотеке, локальной для вашего кода / процесса.

Поскольку эта библиотека Python использует устаревший модуль, который выполняется внутри вашего процесса, Python правильно предупреждает вас.

Согласно ответу Эндрю, библиотека apport автоматически вызывается с необработанным исключением.

Другие вопросы по тегам