#python #package #setuptools
#python #пакет #setuptools
Вопрос:
У меня есть несколько модулей python, которые я в настоящее время упаковал из одного дерева каталогов, которое выглядит так:
toplevel/
setup.cfg
setup.py
toplevel/
__init_.py
a.py
b.py
c.py
...
и они импортируются чем-то вроде
import toplevel.a
Потому что a.py ,b.py , и c.py у них очень разные зависимости, я бы хотел изменить это так, чтобы они находились в отдельных пакетах с отдельными зависимостями.
Я пытался сделать это, используя собственные пакеты пространства имен, но все примеры в документах, которые я видел, похоже, приводят к пакету, в котором модули находятся на подуровне ниже, так что импорт выглядит так
импорт toplevel.a.a
Я заставил это работать, но это не то, что я хочу. Можно ли сделать то, что я хочу, с помощью собственных пакетов пространства имен?
Ответ №1:
Мне кажется, что это невозможно (я с нетерпением жду, когда меня исправят, если это так).
Однако есть обходной путь, который, похоже, работает для меня. Если у вас есть собственная упаковка пространства имен, работающая для импорта формы
import toplevel.a.a
с каждым отдельным деревом пакетов, например
pyproject.toml
setup.cfg
src
toplevel
a
__init__.py
a.py
тогда вместо того, чтобы иметь пустой __init.py__
файл на уровне листа, вы можете вместо этого иметь тот, который содержит
from .a import *
который затем загрузит все имена из a.py в пространство имен toplevel.a, после чего они становятся доступными через
import toplevel.a
Я нашел https://towardsdatascience.com/whats-init-for-me-d70a312da583 полезно подумать об этом.