Я разрабатываю структуру 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
, который преобразует sys.path
и ищет любые модули с подпакелем myframework, и в этом случае он добавляет его в sys.path
, и все работает.
Еще одна идея, которую я написал, - это написать файлы аддонов непосредственно в myframework/addons/
место установки, но тогда это создаст разницу между развертыванием и развертыванием пространства имен.
Есть ли лучший способ выполнить этот или, возможно, другой подход к вышеуказанной проблеме распространения?