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に)、パッケージ化でよく知られており、多くのこと、特にパッケージ管理やバグ報告 ( apport/ ubuntu-bug) などで Python に依存しています。

imp「バージョン 3.4 から非推奨: imp パッケージは、importlib を支持して非推奨となるまで保留中です。」. 私のマシンは少なくとも Python 3.4.3+ 以上を実行しており、ソフトウェアを完全に最新化して更新するには時間と多くの作業が必要であるため、この警告は理解できます。

しかし、私のプログラムは、またはの近く には行きません。私の質問は、のソースから派生した警告がのログに書き込まれないか、またはの親プロセスによって確実に収集されないのはなぜですか?impimportlibapportapportapportstderrapport

私がこれを推測しなければならなかった場合、それは開発者がバッファリングすることを決定したためです-しかし、決してフラッシュも書き込みもしない-ので、次にシステム上apportの子プロセスが書き込みのために開かれるとき(私のプログラムのエラーとして)した)、apport の bufferedも書き込まれます。stderrpythonstderrstderr

これは、Unix に関する私 (私が思う) の知識ではサポートされていません。なぜ 2 つの別々の Python インスタンスがこのように相互作用するのでしょうか?


リクエストに応じて、MCVE に対して私ができる最善の方法は次のとおりです。モジュール レベルのインポートのリストです。

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

輸入しているからwarningsですか?でも……まだ触らないapport


この質問はより話題に沿ったものであり、 AskUbuntuまたはUnix & Linuxよりも SO でより良い回答が得られると思います。そうでないと強く感じる場合は、移行のためにフラグを立てますが、モッズは私に同意すると思います.

4

2 に答える 2

2

私の質問は、apport のソースから派生した警告が apport のログに書き込まれないか、apport の親プロセスの stderr によって確実に収集されないのはなぜですか?

ここでは、apport python ライブラリは別のプロセスで実行されていません。確かに実際のapportプロセスは別ですが、コード/プロセスにローカルなライブラリと対話/バインドしています。

この Python ライブラリは、プロセス内で実行されている非推奨のモジュールを使用しているため、Python は正しく警告しています。

Andrew の回答によると、apport ライブラリは、キャッチされていない例外で自動的に呼び出されます。

于 2016-01-17T18:26:14.630 に答える