97

今日、何か変なことに気づきました。説明したいと思います。私はこれを質問として表現する方法さえ100%確信していなかったので、グーグルは問題外です。奇妙な理由で、ロギングモジュールはモジュールlogging.handlersにアクセスできません。あなたが私を信じていないなら、あなた自身でそれを試してください:

>>> import logging
>>> logging.handlers
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'handlers'
>>> import logging.handlers
>>> logging.handlers
<module 'logging.handlers' from '/usr/lib/python2.6/logging/handlers.pyc'>

なぜこれが起こるのか誰かが説明できますか?

4

4 に答える 4

127

Pythonでは、モジュールにアクセスする前にモジュールをインポートする必要があります。import loggingロギングモジュールのみをインポートします。それloggingはサブモジュールを含むパッケージですが、それらのサブモジュールはまだ自動的にロードされません。したがって、アクセスする前に明示的にインポートする必要がありlogging.handlersます。

__init__.pyなぜこれらの追加のインポートが必要ないように見えるのか疑問に思っている場合:一部のパッケージは、インポート時にサブモジュールの一部またはすべてをインポートします-ファイルでそれらのインポートを行うだけです。他の場合には、あなたがインポートした他の何か、またインポートされたものかもしれませんlogging.handlers。どのコードがインポートを行うかは問題ではありません。プロセス内の何かがアクセスする前にインポートされる限り、logging.handlersそこにあります。また、パッケージのように見えるモジュールが、実際には1つではない場合もosありos.pathます。osはパッケージではなく、(プラットフォーム用の)正しい他のモジュールをインポートして呼び出すpathだけなので、としてアクセスできますos.path

于 2010-09-23T18:49:54.867 に答える
4

私はPythonも初めてで、たくさんの練習を積んだ後、パッケージ(フォルダー)、モジュール(.py)、クラス、変数などを区別できるようになりました。

フォルダのいずれかをPythonパッケージにしたい場合は、__init__.py空のファイルでもファイルが含まれている必要があります。

__init__.pトーマスが言ったように、必要に応じてyに追加のモジュールをインポートできます!!! しかし、モジュール/パッケージはそれをインポートした後にのみアクセス可能です...

モジュールからすべてをインポートしたい場合は、使用できます

from logging import *

残りは、以下のようにハンドラーモジュールにもアクセスできます。

from logging import handlers
print dir(handlers)

于 2010-09-23T19:00:29.830 に答える
3

Thomas Woutersはこの質問に非常によく答えましたが、残念ながら、私は元のドキュメントで答えを見つけた後で初めてこの質問を見つけました。そのために、将来的に検索エンジンの上部に表示されることを期待して、これに追加すると思いました。

質問

エラーが発生する理由:' AttributeError:module' module_name 'には属性がありません' sub_module_name 'エディター(Visual Codeなど)がサブモジュール名を自動入力しても表示されます:

 import module_name
 module_name.sub_module_name(parameter)

答え

エディターは、Pythonの動作ではなく、プロジェクトのファイル構造に基づいてオートコンプリートを作成しています。モジュールをインポートするときに、サブモジュールは「自動的に」インポートされません。使用時にサブモジュールを「自動的に」インポートする方法の詳細については、Pythonドキュメントを参照してください

 import module_name

この回答の主な貢献は、「モジュール」または「パッケージ」をインポートしようとしたときにAttributeErrorが追加されることです。

これが誰かに役立つことを願っています!

于 2019-07-06T14:49:10.677 に答える
1

私は最近、同じ奇妙な状況に直面しました。したがって、サードパーティのlibインポートを削除したに違いありません。from logging import handlersそれはあなたに含まれているまたはfrom logging import *そしてあなたに提供されたlibを削除 しましhandlersた。そして、他のスクリプトでは、あなたは次のようなものを持っていてimport logging、ちょうど使用しましたlogging.handlers、そしてあなたはそれが私がしたように物事が機能する方法であると思いました。

于 2016-10-19T09:54:11.787 に答える