2011-11-16 19 views
5

が、私はこのようになりますプロジェクトを持って失敗します。Pythonの絶対的な輸入は

my_project/ 
      __init__.py -- empty 
      run.py 
      datacheck/ 
        __init__.py -- empty 
        datacheck.py -- containing class DataCheck(object) 
        config.py -- containing BusinessConfig(object) 
        business.py -- containing class BusinessCheck(DataCheck) 

マイPYTHONPATHそれに/ MY_PROJECTを有するように構成されています。

run.pyでは、私は次のコードを持っている:

from datacheck.business import BusinessCheck 
business = BusinessCheck() 
business.check_data() 

business.pyでは、私は失敗し、次の輸入を持っている:

from datacheck.config import BusinessConfig 
from datacheck.datacheck import DataCheck 

from .config import BusinessConfig作品のような相対的なインポート - しかし、私は絶対的なインポートが好まれることを多数のスレッドで読んだ。簡単なテストを行うには

は、私も次のように作成しました:

myproject/ 
      __init__.py -- empty 
      run_test.py 
      test/ 
       __init__.py -- empty 
       test1.py -- containing class Test1(object) 
       test2.py -- containing class Test2(Test1) 

run_test.py輸入をしてTest2クラスを実行し、これは失敗しませんでした。

私はちょっと気まずいままでしたが、datacheckの絶対的なインポートがうまくいかない理由を理解できません - 誰でも説明できますか?

+0

'from datacheck.business import Business'しかし' business.py - クラスを含むBusinessCheck(DataCheck) '...クラス' Business'はどこですか? – eumiro

+0

'datacheck'に' __init __。py'ファイルもありますか?このファイルはディレクトリをパッケージにし、空にすることができます。 –

+0

@eumiro:申し訳ありませんが、間違いはありません - 修正してください。 –

答えて

6

documentationで説明されているように、モジュールを__main__として使用できる場合は、絶対インポートを推奨する必要があります。そうでなければ、相対的な輸入は問題ありません。

パッケージdatacheckにはモジュールdatacheck(同名)が含まれているため、これらのインポートは失敗します。名前を調べると、Pythonは暗黙のうちにパッケージを最初に探します。そこで、モジュールdatacheckが見つかります。ただし、このモジュールには名前がconfigのものは含まれていないので、インポートは失敗します。

絶対インポートを使用する場合は、モジュールdatacheckからすべてのものをパッケージの__init__.pyに移動するか、名前を変更します。

+0

それ(datacheckのdatacheck)それは全部だった、私はこれが不可能であることを知らなかった!ありがとうございます:-) –

+0

@SjaakTrekhaak:それは可能ですが、あいまいさが生じますので、細心の注意が必要です。 –

2

私はこれが後で何年も知っているが、ここでは検索他人のために、私はこのコードのビットと同様の問題を解決することができた。その後

from __future__ import absolute_import 

、絶対的な輸入はにうまく働きましたPython 2.6と2.7です。

関連する問題