2

私は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
        ...
    ... 

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

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

私はこれを(testSuite1_1.py内から)使用できることを意味すると解釈しました:

src.pkg1からimportmod1_1

また

src.pkg1.mod1_1をインポートします

どちらも機能しません。私はここで同様の質問に対するいくつかの答えを読みましたが、解決策を見つけることができませんでした。

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

4

2 に答える 2

2

.pyモジュール名に拡張子は含まれていません。また、この例では、最上位モジュールの名前は実際にはtopです。そして最後に、ハイフンはPythonの名前には使用できません。ハイフンを、アンダースコアに置き換えることをお勧めします。次に、試してください:

from top.src.pkg1 import mod1_1
于 2012-02-16T02:51:21.323 に答える
0

http://legacy.python.org/doc/essays/packages.html(同様の質問で参照)の助けを借りて問題を解決しました。重要なポイント(経験豊富なPython開発者には明らかなperhpas)は次のとおりです。

「Pythonプログラムがパッケージを使用するには、importステートメントでパッケージを見つけることができる必要があります。つまり、パッケージはsys.pathにあるディレクトリのサブディレクトリである必要があります。[...]最も簡単な方法パッケージがsys.pathにあることを確認するには、パッケージを標準ライブラリにインストールするか、ユーザーに$PYTHONPATHシェル環境変数を設定してsys.pathを拡張してもらいます。」

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

于 2012-02-16T21:33:03.073 に答える