Как мне структурировать мой проект Python, чтобы разрешить импорт именованных модулей из подкаталогов
Это моя структура каталогов:
Projects
+ Project_1
+ Project_2
- Project_3
- Lib1
__init__.py # empty
moduleA.py
- Tests
__init__.py # empty
foo_tests.py
bar_tests.py
setpath.py
__init__.py # empty
foo.py
bar.py
Цели:
Иметь организованную структуру проектаУметь независимо запускать каждый файл .py при необходимостиБыть в состоянии ссылаться / импортировать как родного брата, так идвоюродная сестра модулиСохраняйте все операторы import / from в начале каждого файла.Я достиг # 1, используя вышеупомянутую структуру
Я в основном достиг 2, 3 и 4, выполнив следующее (как рекомендованоэто отличное руководство)
В любой пакет, которому требуется доступ к родительским или двоюродным модулям (например, каталог Tests выше), я включаю файл с именем setpath.py, который имеет следующий код:
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
sys.path.insert(0, os.path.abspath('.'))
sys.path.insert(0, os.path.abspath('...'))
Затем в каждом модуле, которому нужен доступ для родителей / двоюродных братьев, например, foo_tests.py, я могу написать хороший чистый список импорта, например:
import setpath # Annoyingly, PyCharm warns me that this is an unused import statement
import foo.py
Внутри setpath.py вторая и третья вставки не являются строго необходимыми для этого примера, но включены в качестве шага устранения неполадок.
Моя проблема в том, что это работает только для импорта, который ссылается на имя модуля напрямую, а не для импорта, который ссылается на пакет. Например, внутри bar_tests.py ни один из двух приведенных ниже операторов не работает при запуске bar_tests.pyнепосредственно.
import setpath
import Project_3.foo.py # Error
from Project_3 import foo # Error
Я получаю ошибку «ImportError: Нет модуля с именем« Project_3 »».
Странно, что я могу запустить файл прямо из PyCharm, и он работает нормально. Я знаю, что PyCharm делает что-то закулисное волшебство сPython Path
переменная, чтобы все работало, но я не могу понять, что это такое. Поскольку PyCharm просто запускает python.exe и устанавливает некоторые переменные среды, должна быть возможность клонировать это поведение из самого скрипта Python.
По причинам, не совсем уместным к этому вопросу, я должен ссылатьсяbar
с использованиемProject_3
Классификатор.
Я открыт для любого решения, которое достигнет вышеупомянутого, все еще встречая мои более ранние цели. Я также открыт для альтернативной структуры каталогов, если есть такая, которая работает лучше. Я прочиталPython док на импорт и пакеты, но я все еще в растерянности. Я думаю, что одним из возможных путей может быть ручная настройка__path__
переменная, но я не уверен, какой из них нужно изменить или на что его установить.