TL; DR:Pythonの3.3で
あなたは自分の名前空間のパッケージディレクトリ内の任意の__init__.py
を入れていないし、それがうまく動作しますが、何もする必要はありません。 3.3より前のバージョンでは、pkg_resources.declare_namespace()
のソリューションはpkgutil.extend_path()
を選択してください。将来的には暗黙の名前空間パッケージと互換性があるためです。
Python 3.3では暗黙の名前空間パッケージが導入されています(PEP 420を参照)。
これはimport foo
によって作成できるオブジェクトの3種類が今あることを意味:
__init__.py
ファイルを含むディレクトリfoo
で表さfoo.py
ファイル
- 通常のパッケージ、に代表されるモジュール
- 1つ以上のディレクトリによって表される名前空間パッケージ
foo
__init__.py
ファイルなし
パッケージもモジュールですが、ここでは「モジュール」と言うときは「非パッケージモジュール」を意味します。
まず、モジュールまたは通常のパッケージについてsys.path
をスキャンします。成功すると、検索を停止し、モジュールまたはパッケージを作成し、初期化します。モジュールまたは標準パッケージが見つからないが、少なくとも1つのディレクトリが見つかった場合は、名前空間パッケージを作成して初期化します。
モジュールと通常のパッケージには、__file__
が作成された.py
ファイルに設定されています。通常のパッケージと名前空間パッケージは、作成されたディレクトリに__path__
が設定されています。
あなたがimport foo.bar
を行うと上記の検索がfoo
のために最初に発生したパッケージが見つかった場合、その後、bar
の検索が代わりにsys.path
の検索パスとしてfoo.__path__
で行われます。 foo.bar
が見つかった場合は、foo
とfoo.bar
が作成され、初期化されます。
正規パッケージと名前空間パッケージはどのように混在しますか?通常はそうではありませんが、古いpkgutil
明示的な名前空間パッケージメソッドは暗黙の名前空間パッケージを含むように拡張されています。あなたはこのような__init__.py
を持っている既存の定期的なパッケージを持っている場合は
は:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
...従来の動作は、その__path__
に検索パス上の他の定期パッケージを追加することです。しかし、Python 3.3では、名前空間パッケージも追加されています。
ですから、次のようなディレクトリ構造を持つことができます。
├── path1
│ └── package
│ ├── __init__.py
│ └── foo.py
├── path2
│ └── package
│ └── bar.py
└── path3
└── package
├── __init__.py
└── baz.py
を...そして限り、2 __init__.py
は(、およびpath1
path2
とpath3
があなたのsys.path
である)extend_path
ラインを持っているようimport package.foo
、import package.bar
とimport package.baz
はすべて動作します。
pkg_resources.declare_namespace(__name__)
は、暗黙の名前空間パッケージを含むように更新されていません。
module1とmodule2はモジュールではなくサブパッケージです。私が理解しているように、モジュールは基本的に単一のファイルです。たぶんsubpkg1とsubpkg2は名前として意味が分かりますか? – Alan