Тот факт, что у вас есть __init.py__
в каталоге parent
, предполагает, что parent
является частью структуры вашего пакета и что его родительский каталог , каким бы он ни был, должен находиться в ПУТИ. Следовательно, ваш импорт действительно должен быть:
from parent.one import bar
Для структуры каталогов приложения может быть полезно иметь один root. Затем __init.py__
в этом единственном пакете root можно использовать для загрузки модулей из подпакетов, но это, конечно, не является обязательным требованием. Если это не было вашим намерением, вам, вероятно, следует удалить __init__.py
, который находится в parent
, поскольку он не служит цели (и сбивает с толку), и убедитесь, что каталог parent
находится в вашем PATH.
ОДНАКО : до тех пор, пока текущий каталог, в котором вы находитесь, когда вы запускаете свою программу, является родительским каталогом для root (ов) вашей структуры пакета, Python должен иметь возможность найти ваши пакеты без каких-либо специальных действий с вашей стороны, потому что текущий каталог автоматически добавляется к пути. Если это неудобно, вы можете установить переменную среды PYTHONPATH .
Итак, определите, следует ли вам изменять оператор импорта или нет, в зависимости от того, какие каталоги являются частью структуры вашего пакета. Затем вы должны настроить Python, чтобы найти ваши пакеты, установив текущий каталог, PYTHONPATH или sys.path
в требуемый каталог, но сделайте это один раз. Если вам нужно установить sys.path
, я бы сделал это в вашей основной программе при запуске, прежде чем она должна будет что-либо включать:
Если foo.py
- ваша основная программа, то в в верхней части программы у меня было бы:
if __name__ == '__main__':
from pathlib import Path
import sys
# if your import statement is: from parent.one import bar, then:
sys.path.insert(0, str(Path(__file__).parent.parent))
"""
# if your import statement is: from one import bar, then:
sys.path.insert(0, str(Path(__file__).parent))
"""