Я разрабатываю несколько проектов Python для нескольких клиентов одновременно. Упрощенная версия структуры папок моего проекта выглядит примерно так:
/path/
to/
projects/
cust1/
proj1/
pack1/
__init__.py
mod1.py
proj2/
pack2/
__init__.py
mod2.py
cust2/
proj3/
pack3/
__init__.py
mod3.py
Когда я, например, хочу использовать функции из proj1
, я расширяю sys.path
на / path / to / projects / cust1 / proj1
(например, установив PYTHONPATH
или добавив файл .pth
в папку site_packages
или даже изменив sys.path
напрямую), а затем импортируйте модуль следующим образом:
>>> from pack1.mod1 import something
По мере того, как я работаю над большим количеством проектов, случается, что разные проекты имеют идентичные имена пакетов:
/path/
to/
projects/
cust3/
proj4/
pack1/ <-- same package name as in cust1/proj1 above
__init__.py
mod4.py
Если я теперь просто расширю sys.path
от / path / to / projects / cust3 / proj4
, я все еще могу импортировать из proj1
, но не из proj4
:
>>> from pack1.mod1 import something
>>> from pack1.mod4 import something_else
ImportError: No module named mod4
Я думаю Причина сбоя второго импорта заключается в том, что Python ищет только первую папку в sys.path
, где находит пакет pack1
, и отказывается, если не находит mod4
по модулю ле там. Я спрашивал об этом в предыдущем вопросе, см. импорт модулей Python с тем же именем , но внутренние детали для меня все еще неясны.
В любом случае, очевидное решение - добавить еще один уровень квалификации пространства имен, превратив каталоги проекта в суперпакеты: добавьте файлы __ init __. Py
в каждую папку proj *
и удалите эти папки из строк, расширяющих sys.path
, например
$ export PYTHONPATH=/path/to/projects/cust1:/path/to/projects/cust3
$ touch /path/to/projects/cust1/proj1/__init__.py
$ touch /path/to/projects/cust3/proj4/__init__.py
$ python
>>> from proj1.pack1.mod1 import something
>>> from proj4.pack1.mod4 import something_else
Теперь я сталкиваюсь с ситуацией, когда разные проекты для разных клиентов имеют одно и то же имя, например
/path/
to/
projects/
cust3/
proj1/ <-- same project name as for cust1 above
__init__.py
pack4/
__init__.py
mod4.py
Попытка импорта из mod4
больше не работает по той же причине, что и раньше:
>>> from proj1.pack4.mod4 import yet_something_else
ImportError: No module named pack4.mod4
Следуя тому же подходу, который решал эту проблему раньше, я бы добавил еще один слой пакета / пространства имен и обратил бы клиента папки в супер супер пакеты.
Однако это противоречит другим требованиям, предъявляемым к структуре папок моего проекта, например
Менее упрощенное, более реальное изображение некоторых папок проекта выглядит следующим образом:
/path/
to/
projects/
cust1/
proj1/
Development/
code/
javascript/
...
python/
pack1/
__init__.py
mod1.py
doc/
...
Release/
...
proj2/
Development/
code/
python/
pack2/
__init__.py
mod2.py
Я не понимаю, как я могу удовлетворить требования интерпретатора Python к структуре папок и те, которые у меня есть в в то же время. Возможно, я мог бы создать дополнительную структуру папок с некоторыми символическими ссылками и использовать ее в sys.path
, но, глядя на усилия, которые я уже прилагаю, у меня возникает ощущение, что что-то в корне не так со всем моим подход.Кстати, мне также трудно поверить в то, что python действительно ограничивает меня в выборе имен папок с исходным кодом, как это, кажется, происходит в изображенном случае.
Как мне настроить папки проекта и sys.path
, чтобы я мог импортировать из всех проектов согласованным образом, если есть проект и пакеты с одинаковыми именами?