Как управлять несколькими подпроектами Python с помощью setuptools?
Я задаюсь вопросом о правильном / простом / наиболее питоническом способе работы с подпроектами, которые вы хотите использовать в одном базовом пакете. В настоящее время у нас есть такая файловая структура:
trunk\
proj1\setup.py
company_name\__init__.py + proj1's code
proj2\setup.py
company_name\__init__.py + proj2's code
Мы хотим, чтобы пространство имен company_name было общим для всех наших проектов (может быть, это само по себе не пифонично?), Но когда proj1 и proj2 установлены в режиме разработки, первый установленный не работает. Это выглядит как import company_name...
запутывается в том, какой пакет company_name искать, и захватывает первый / последний / случайный пакет.
Как бы это обычно обрабатывалось в большем проекте Python? Можно ли решить это с помощью setup.py в стволе, который создает какое-то мега-яйцо? Я не нашел никакой соответствующей информации в Google или стеке, поэтому любая информация, даже просто ссылки, очень ценится!
редактировать: я просто попытался добавить setup.py в корневую папку с
...
namespace_packages = ['company_name'],
package_dir = {'company_name' : ['proj1/company_name', 'proj2/company_name']}
...
с соответствующими pkg_resources.declare_namespace(__name__)
в __init_.py
файлы, но ./setup.py bdist_egg
просто дает:
ошибка в команде настройки company_name: в дистрибутиве нет модулей или пакетов для пакета пространства имен 'company_name'
1 ответ
Хотя я не могу поручиться за питонность своего решения, я, наконец, все вместе прекрасно запустил. Я был на правильном пути с пакетами пространства имен, но вместо того, чтобы пытаться иметь один суперпроект в стволе, я добавил namespace_packages
строка в setup.py каждого отдельного проекта. Это привело к правильному поведению при установке вместе, разделяя company_name
пространство имен, как и предполагалось.
Любой, кто хочет присоединиться к тому, является ли это разумным решением для Python, мне все еще интересно узнать, так ли это на самом деле. Это кажется правильным, но это может быть потому, что он имитирует стиль Java, к которому я привык.