1

ヘッダーは非常に理解しにくいかもしれませんが、できる限り説明します。

SubModule合計 3 つのファイルを含むフォルダーがあります。

__init__.py
Class1.py
Class2.py

の中__init__.pyで、私はこれを手に入れました:

import Class1
import Class2

def main():
    c1 = Class1.Class1()
    c2 = Class2.Class2()

if __name__ == "__main__":
    main()

そして、すべてエラーなく正常に動作し、c1 と c2 を適切に使用できます。


SubModuleフォルダーを他のモジュールの (と呼びましょう) フォルダーの下に移動しようとすると、問題が発生しMainModuleます。したがって、次のようになります。

MainModule\__init__.py
MainModule\SubModule\__init__.py
MainModule\SubModule\Class1.py
MainModule\SubModule\Class2.py

今、次のようにインポートしようとするSubModuleMainModule\__init__.py:

import SubModule
c1 = SubModule.ClassOne.ClassOne()
c2 = SubModule.ClassTwo.ClassTwo()

これでうまくいくと思います。ただし、 を実行すると、次MainModule\__init__.pyのエラーが発生します SubModule\__init__.py

Traceback (most recent call last):
  File "C:\...\MainModule\__init__.py", line 1, in <module>
    import SubModule
  File "C:\...\MainModule\SubModule\__init__.py", line 1, in <module>
    import Class1
ImportError: No module named 'Class1'

ご覧のとおり、エラーは から発生し、 があることがわかりimport Class1ますNo module named 'Class1'。これは、パスがSubModule.Class1ただではなく、現在になっている原因Class1です。これに変更することで、このエラーを取り除くことができますSubModule\__init__.py

import SubModule.Class1
import SubModule.Class2

ただし、 を実行してSubModule単独で使用することはできなくなりました。SubModule\__init__.pyimport Class1import SubModule.Class1

これは私を夢中にさせています。インポートを一般化する方法はありますか?どのモジュールが SubModule をインポートするかは問題ではありませんか?

4

2 に答える 2

0

モジュールは、常にシステム パスから絶対にインポートする必要があります。したがって、パッケージ MainModule にサブパッケージ SubModule が含まれている場合は、from MainModule import SubModule(またはfrom . import SubModule) を実行する必要があります。また、SubModule 内でfrom . import Class1. これにより、へのパスに関係なく機能するはずSubModuleです。SubModule(ただし、メイン ファイルとして実行する場合とインポートする場合の 2 つの異なる方法でインポートすると、依然として奇妙なことが起こります。)

于 2012-12-01T20:53:11.270 に答える