Pracuję nad strukturą Pythona, która miałaby "dodatki" napisane jako osobne pakiety. Tj .:Umieszczanie oddzielnych pakietów Pythona w tej samej przestrzeni nazw?
import myframework
from myframework.addons import foo, bar
Teraz, co staram się zorganizować to tak, że te dodatki mogą być rozpowszechniane oddzielnie od ramy bazowej i wstrzyknięto do myframework.addons
nazw.
Obecnie moje najlepsze rozwiązanie jest następujące. Add-on będzie wdrożony (najprawdopodobniej w {python_version}/site-packages/
tak:
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
miałby kod pkgutil przedłużacza Ścieżka:
import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)
Problem polega na tym, aby to działało, PYTHONPATH musi mieć w sobie fooext/
, jednak jedyną rzeczą, którą mógłby mieć, jest katalog instalacji nadrzędnej (najprawdopodobniej wspomniany wyżej) .
Rozwiązaniem tego problemu jest posiadanie dodatkowego kodu w myframework/addons/__init__.py
, który przechodziłby pod numerem sys.path
i szukał dowolnego modułu z podpakietem myframework, w takim przypadku dodaje go do sys.path
i wszystko działa.
Innym pomysłem było napisanie plików dodatków bezpośrednio do lokalizacji instalacji myframework/addons/
, ale wtedy różnice w rozmieszczaniu i wdrażaniu przestrzeni nazw byłyby inne.
Czy istnieje lepszy sposób na osiągnięcie tego lub może inne podejście do powyższego problemu z dystrybucją w ogóle?
Zobacz odpowiedź Aleca poniżej. Setuptools ma coś dokładnie takiego, zwane punktami wejścia. –