Путь импорта python: пакеты с одинаковыми именами в разных папках

Я разрабатываю несколько проектов 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

Следуя тому же подходу, который решал эту проблему раньше, я бы добавил еще один слой пакета / пространства имен и обратил бы клиента папки в супер супер пакеты.

Однако это противоречит другим требованиям, предъявляемым к структуре папок моего проекта, например

  • Структура разработки / выпуска для поддержки нескольких строк кода
  • другие виды исходного кода, например, JavaScript, SQL и т. Д.
  • другие файлы, кроме исходных файлов, например, документы или данные.

Менее упрощенное, более реальное изображение некоторых папок проекта выглядит следующим образом:

/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 , чтобы я мог импортировать из всех проектов согласованным образом, если есть проект и пакеты с одинаковыми именами?

22
задан Community 23 May 2017 в 12:00
поделиться