Импортер Python с импортом из разных папок

#python #package #python-import

Вопрос:

Я следую этому руководству, чтобы узнать, как структурировать хороший проект: Структурирование вашего проекта. И у меня возникли проблемы с импортом модулей из разных папок. Мой проект структурирован следующим образом:

 project
│   .gitignore
│   LICENSE
│   Makefile
│   README.md
│
├───project
│       main.py
│       __init__.py
│
└───tests
        context.py
        var_class.py
        __init__.py
 

Во main.py мне есть

 # main.py

class Var():
    pass
 

В context.py я следовал приведенному выше руководству, поэтому я:

 # context.py

import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

import project  
 

Во var_class.py мне есть:

 # var_class.py

from .context import project

x = project.main.Var()
 

Запускаю последний, который я получаю:

 $ python var_class.py
Traceback (most recent call last):
  File "c:UsersMatteoDocumentsprojecttestsvar_class.py", line 1, in <module>
    from .context import pierre
ImportError: attempted relative import with no known parent package
 

Что я делаю не так? Спасибо всем, кто мне поможет.

Комментарии:

1. Попробуйте добавить __init__.py файл в родительскую project папку. Он пытается импортировать context из своего родительского пакета, которого не существует.

2. @koorkevani это не решило проблему, произошла та же ошибка

3. Попробуйте изменить строку на from ..context import project (сохраняя __init__.py при этом )

4. @koorkevani все еще испытывает ту же проблему

5. нашел проблему. __init__.py не требуется, как и двойной период. Однако вам нужно запустить его с -m флагом, чтобы сообщить python, что существует локальная иерархия модулей. Затем введите свой верхний project реж python3 -m tests.var_class . (или реж. над верхом project , и python3 -m project.tests.var_class ). Ошибка все еще есть, но она происходит из project/__init__.py -за того, что не выполняется автоматический импорт main . Добавьте к этому строку from . import main , и все готово.