Как мне структурировать мой проект 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__ переменная, но я не уверен, какой из них нужно изменить или на что его установить.

Ответы на вопрос(2)

Ваш ответ на вопрос