2009-08-11 2 views
5

私は自分のモジュールでビルドされたPythonのもの(特にロギングモジュール)を上書きすることに問題があります。ここに私のプロジェクトのレイアウトです:もう一つの絶対的なインポートの問題

run.py 
package/ 
     __init__.py 
     logging/ 
       __init__.py 
     ... 

run.py

from package import main 

main() 

パッケージ/ __ init__.py

from __future__ import absolute_import 
import logging 
import logging.config 

def main(): 
    logging.config.fileConfig(...) 

パッケージ/伐採それとして/ __ init__.py

class Logging(object): 
    pass 

今のところ、上記のコードが動作します。できるだけ早く私はそうのようpackage.loggingからロギングクラスをインポートしようとして:

from __future__ import absolute_import 

import logging 
import logging.config 
from package.logging import Logging 

def main(): 
    logging.config.fileConfig(...) 

私はエラーを取得する:

AttributeError: 'module' object has no attribute 'config' 

私はPEP 328リリースノートを読んで、絶対的な輸入があることがわかってきましたむしろ単純です。残念ながら、私はこれを理解することができませんでした。

私はここで何が欠けていますか?

答えて

1

あなたはPythonが最初のモジュールを検索する場所を強制するためにrelative importsを使用することができます。

in package/__init__.py

from . import logging 
+0

あなたの例を使用すると動作するようです。しかし、ここでは、Loggingクラスをlogging.Loggingと呼ぶ必要があります。さらなるテストでは、PEP 328が示唆しているように、 ".logging import Loggingから"は動作していないようです。私はまだ "package.loggingインポートロギングから"が動作しない理由を理解できません。それは絶対的な輸入ではありませんか? – kierse

+0

あなたはどのバージョンのpythonを使用していますか?古いバージョン(2.4など)の場合、相対インポートが機能しないか、少なくとも期待どおりに動作しない可能性があります。 – Soviut

+0

私はPython 2.6.2を実行しています – kierse

9

相対と絶対の輸入(PEP 328)ここでの問題ではありません。

何が起こるかは、パッケージ内のモジュールをインポートすると、暗黙的にこのパッケージの名前空間に追加されます。したがって

from package.logging import Logging 

パッケージに「ログ」を追加するだけでなく、 _dict _だけでなく、 'logging'(新しくインポートされたローカルモジュール)をパッケージに追加します。 _dict _。最初にロギング(トップレベルモジュール)をインポートし、package.loggingとして利用可能にしてから、この変数をローカルモジュールで上書きします。これは基本的には、期待どおりにトップレベルモジュールとローカルモジュールにアクセスするためのpackage.loggingを持つことができないことを意味します。

この特定のケースでは、トップレベルのロギングモジュールをパブリック名として「エクスポート」したくないかもしれません。代わりに:

from logging import config as _config 
def main(): 
    _config.fileConfig(...) 
+0

うわー、ちょうど新しいPythonの問題を学んだだけです。私は自分自身でこれをテストする必要があった、そしてそれはあなたの言うとおりです。他の人がこれを確認したい場合は、 'package.logging import Logging'のあとに' print logging'を追加してください。 –

関連する問題