Pythonのドキュメントには、Python で名前空間パッケージを作成する 3 つの方法が詳しく説明されており、3 つの方法のそれぞれをいつ使用するかについてのガイドラインも含まれています。さらに、このトピックは別の StackOverflowスレッドで非常に詳細に議論されています。最後に、ドキュメントよりもコードを読みたい方のために、sample-namespace-packages
レポには、利用可能な 3 つの方法のそれぞれを使用して作成された名前空間パッケージの例が含まれています。
簡単に言うと、パッケージを Python バージョン 3.3 以降で動作させる場合は、ネイティブの名前空間パッケージメソッドを使用する必要があります。パッケージを古いバージョンの Python で動作させる場合は、pkgutil
メソッドを使用する必要があります。メソッドを既に使用している名前空間に名前空間パッケージを追加する場合は、pkg_resources
メソッドを引き続き使用する必要があります。
ネイティブ名前空間パッケージを使用する__init__.py
と、両方のパッケージから削除し、 setup.pyファイルを次のように変更できます。
# setup.py file for my_data.source_a
from setuptools import setup, find_namespace_packages
setup(
name="my_data.source_a",
version="0.1",
packages=find_namespace_packages(include=['my_data.*'])
)
# setup.py file for my_data.source_b
from setuptools import setup, find_namespace_packages
setup(
name="my_data.source_b",
version="0.1",
packages=find_namespace_packages(include=['my_data.*'])
)
include=['my_data.*']
引数を追加する必要があるのは、ここでfind_namespace_packages()
説明されているように、既定では名前空間パッケージとして含まれるフォルダーがかなり緩いためです。
これは、Python 3.3 以降をサポートするパッケージに推奨されるアプローチです。
pkgutil
-style 名前空間 packagesでは、各パッケージmy_data.__init__.py
のファイルに次の行を追加する必要があります。
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
これは、backports
名前空間とリポジトリ内のさまざまなパッケージで使用されるアプローチgoogle-cloud-python
であり、古いバージョンの Python をサポートするために推奨されるアプローチです。