3

現在、私はより大きなプログラムを試しています。コードに印刷物を追加するのではなく、ロギング モジュールを使用したいと考えています。でも最初は落ちました。私は 2 ページのプログラムを持っていて、できる限り単純なログ記録を追加しましたが、うまくいきませんでした。それで、私は例を実行しました、そしてそれはうまくいきました。次に、コードを停止する原因が見つかるまで、コードを 1 行ずつサンプルに落とし込みました。ほぼ空のモジュールを 1 回簡単にインポートすると、適切なロギング動作が停止します。

# import ntu.dummy
import logging
LOG_FILENAME = 'example_15.log'
print 'before basicconfig'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
print 'before log write'
logging.debug('This message should go to the log file')
print 'after log write'

# import ntu.dummy を使用すると、プログラムが実行され、デバッグが出力され、予想される内容の .log ファイルがプログラムのフォルダーに保存されます。これは、IDLE 内から、または OS 内で直接当てはまります。

import ntu.dummy の実行を許可するために # を削除すると、プログラムが実行され、デバッグが出力されますが、.log ファイルはプログラムのフォルダーにも、マシン上の他の場所にも AFAICS に作成されません。

C:\Python26\Lib\ntu\ には __init__.py が含まれており、このファイルの dummy.py の内容は ...

def bolleaux():
    """ empty function """
    return None

import ntu.dummy ステートメントの代わりに、ランダム、Tkinter、os.path など、あらゆる種類の他のインポートを使用できます。これにより、ロギングが失敗することはありません。

助けてください、何が起こっているのですか?

4

1 に答える 1

0

どっ!

ntu パッケージには、テストと更新を容易にするために、他の多くの単一関数または単一クラス モジュールが含まれています。これらのいくつかは友人から提供されたもので、その内容についてはよく知りませんでした。パッケージの幅が大きくなってきたので、彼は __init__.py に ... を入れることを提案しました。

from modname import ClassName

そこにあるモジュールごとに、ClassName を ntu 名前空間に取り込みます。これは、モジュールのいずれかを使用したいときに、単に使用することを意味します

import ntu       # instead of import ntu.modname for each module !

そしてもちろん、彼のモジュールの 1 つは、クラス定義の前のモジュール レベルで logging.basicConfig を実行します。したがって、モジュールをインポートするだけですが、そうすると __init__ が実行され、モジュールがインポートされ、その後のロギングの使用が妨げられます。そのチェーン内のリンクをコメント アウトすると、ロギングが適切に機能します。

パッケージで import を使用することがそれほど大きな節約になるかどうかはわかりませんが、このような厄介な副作用が発生する可能性があります。したがって、すべてのモジュールを packname.modname からインポートすることに戻ります。

しかし、私はいつかその危険なモジュールを使用したいので、それをより安全にするか、彼にそれをより安全にする必要があります.

どうもありがとう

于 2013-01-19T07:57:56.823 に答える