「アドオン」を個別のパッケージとして作成する Python フレームワークを開発しています。すなわち:
import myframework
from myframework.addons import foo, bar
今、私が調整しようとしているのは、これらのアドオンをコア フレームワークとは別に配布し、myframework.addons
名前空間に挿入できるようにすることです。
現在、これに対する私の最善の解決策は次のとおりです。アドオンがデプロイされます (ほとんどの{python_version}/site-packages/
場合、次のようになります:
fooext/
fooext/__init__.py
fooext/myframework/
fooext/myframework/__init__.py
fooext/myframework/addons/
fooext/myframework/addons/__init__.py
fooext/myframework/addons/foo.py
にはfooext/myframework/addons/__init__.py
、pkgutil パス拡張コードがあります。
import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)
問題は、これが機能するために PYTHONPATH が含まれている必要があることfooext/
ですが、それが持つ唯一のものは親インストールディレクトリ (ほとんどの場合、上記のsite-packages
) です。
myframework/addons/__init__.py
これに対する解決策は、myframework サブパッケージを含むモジュールをトラバースして検索する追加のコードを用意することです。sys.path
この場合、それを追加するsys.path
とすべてが機能します。
私が持っていた別のアイデアは、アドオンファイルをインストール場所に直接書き込むことですmyframework/addons/
が、そうすると、開発と展開された名前空間が異なってしまいます。
これを達成するためのより良い方法、または上記の配布の問題に対する別のアプローチはありますか?