1

起動パラメーターなどに基づいて、実行時にモジュールを動的にインポートするモジュラー アプリケーションを作成しています。整理するために、次のディレクトリ構造を使用しています。

    myapp/
    ├── __init__.py
    ├── main.py
    ├── utils.py
    ├──modules/
        ├── __init__.py
        ├── iptables/
        │   ├── __init__.py
        │   ├── iptables.py
        │   ├── [other files/directories/configuration...]
        │   └── tests
        │       ├── iptables_tests.py
        ├── layer4/
        │   ├── __init__.py
        │   ├── layer4.py
        │   ├── [other files/directories/configuration...]
        │   └── tests
        │       ├── layer4_tests.py

私は次のことを達成しようとしています:

  • main.py内のクラスで、 のfrom modules.layer4 import Layer4Managerようなことができるはずです。同じディレクトリに他のスクリプト/ファイルがあるため、可能であれば実際のコードを含めずにこれを行いたいので、それらをディレクトリにグループ化することは理にかなっています(これがスクリプトが「 t はディレクトリ内だけです)。Layer4Managermodules/layer4/layer4.py__init__.pymodules

  • iptables.pyからlayer4.py関数をインポートできるはずutils.pyです。

  • Python unittest フレームワークと Nose を使用したテストは、たとえば、およびiptables_tests.pyを実行できる必要がfrom myapp.modules.iptables import IPTablesControllerありfrom myapp.utils import UtilityFunctionます。

私はこれと数時間戦っていますが、上記の 3 つの項目を同時に動作させることができません。from layer4 import *or__all__変数を内部で使用modules/layer4/__init__.pyすると、テストが中断されfrom myapp.utils import UtilityFunctionます。

ブランキングmodules/*/__init__.pyすると、できなくなりfrom myapp.modules.layer4 import Layer4Managerます。

他のいくつかの組み合わせを試しましたが、事態を悪化させているだけだと思います。私はPython 2.6をターゲットにしています。ある種の相対インポートを使用すると作業が簡単になると思いますが、ここで使用している 2 レベルのディレクトリ構造でどのように機能するかはわかりません。

前もって感謝します!

4

2 に答える 2

0

「from modules.layer4.layer4 import Layer4Manager」は最初のインポートで機能するはずです-そうではありませんか、それとも十分ではありませんか?

あなたの utils.py は、その下のモジュールからもインポートされますか? その場合、循環インポートを作成している可能性があります (推測ですが、すべてのインポートを一度に機能させることができない理由になる可能性があります...)。その場合、utils.py のインポート時にインポートが実行されないように、インポートをコード ブロックに移動する必要がある場合があります。これは、__init__.py でインポートを行うとテストが壊れる理由を説明している可能性があります。

それ以外の場合、「from modules.layer4 import Layer4Manager」を機能させたい場合は、何らかの形で __init__.py に取り込む必要があります-おそらくそこにインポートすることによって。

于 2012-10-30T21:40:34.367 に答える
0

main/__init__.pyパッケージを作りたくないので必要ありませんしmyapp、main.py を実行すると、myapp が自動的に python パスに追加されます。

それ以外は問題ないように見えますが、正しいパスを入力すれば、サブパッケージからモジュールを直接インポートできるはずです。

import utils
from modules.layer4 import layer4

同様の構造を作成しましたが、うまく機能します。

$ cat myapp/main.py 
import utils
from modules.layer4 import layer4
from modules.iptables import iptables

$ cat myapp/modules/iptables/iptables.py
from modules.layer4 import layer4

$ cat myapp/modules/layer4/layer4.py
import utils

そして、これはすべてエラーなしで機能します

于 2012-10-30T21:36:52.750 に答える