2012-02-16 15 views
2

私はちょうどPythonから始まり、パッケージ内モジュールロードの検索パスを理解するのに困っています。インパッケージモジュールがPythonで読み込まれる

top/      Top-level package 
    __init__.py    Initialize the top package 
    src/     Subpackage for source files 
     __init__.py 
     pkg1/   Source subpackage 1 
     __init__.py   
     mod1_1.py 
     mod1_2.py 
     ... 
     pkg2/   Source subpackage 2 
     __init__.py 
     mod2_1.py 
     mod2_2.py   
     ... 
     ... 
    test/     Subpackage for unit testing 
     __init__.py 
     pkg1Test/  Tests for subpackage1 
     __init__.py 
     testSuite1_1.py 
     testSuite1_2.py 
     ... 
     pkg2Test/  Tests for subpackage2 
     __init__.py 
     testSuite2_1.py 
     testSuite2_2.py 
     ... 
    ... 

私はモジュールmod1_1.py(など)をインポートする必要があります。どのようなインポートステートメントを使用する必要がありますか? Pythonの公式チュートリアル(docs.python.org、sec 6.4.2):

"インポートされたモジュールが現在のパッケージ(現在のモジュールがサブモジュールであるパッケージ)に見つからない場合、インポートステートメントは、指定された名前を持つトップレベルのモジュールを探します。

は私が(testSuite1_1.py内から)を使用することができることを意味するため、これを取った:src.pkg1インポートmod1_1から

または

輸入src.pkg1.mod1_1

いずれも動作しません。私はここで同様の質問に対するいくつかの答えを読んだが、解決策を見つけることができなかった。

編集:Pythonの命名規則に従ってモジュール名を変更しました。しかし、私はまだこの単純な例を得ることはできません。

+0

これは、ダッシュの構文エラーです。 –

答えて

0

問題は、(同様の質問に呼ばれます)。

"Pythonプログラムがパッケージを使用するためには、パッケージはimport文で見つけられる必要があります。つまり、パッケージは次のようになっている必要があります。 sys.pathにあるディレクトリのサブディレクトリです。[...]パッケージがsys.path上にあることを確認する最も簡単な方法は、標準ライブラリにインストールするか、ユーザーがsys.pathを$ PYTHONPATHシェル環境変数 "

" top "へのパスをPYTHONPATHに追加すると問題が解決しました。ソリューションを移植可能にするには(これは個人的なプロジェクトですが、複数のマシンで共有する必要があります)トップ/ setup.pyの初期化コードが動作するはずです。

+0

リンクが壊れています – Michael

+0

レガシーウェブサイトを指すリンクを修正しました – stefano

2

モジュール名には.py拡張子は含まれていません。また、あなたの例では、トップレベルのモジュールは実際にはtopという名前です。そして最後に、ハイフンはPythonの名前には合法ではありません。私はそれらをアンダースコアに置き換えることを提案します。そして、試してみてください。http://legacy.python.org/doc/essays/packages.htmlの助けを借りて解決

from top.src.pkg1 import mod1_1 
+0

慣例に従うように名前を変更しましたが、あなたの提案する構文でも同じエラーが表示されます – stefano

+0

PYTHONPATHの 'top'フォルダはありますか? – tzaman

関連する問題