Невозможно импортировать var из верхнего пакета

Это моя структура проекта:

myProject/
|
|-- src/
|   |-- services/
|   |   |-- __init__.py
|   |   |-- users.py
|   |   
|   |-- main.py
|   |-- ...
...

В основном у меня есть mongo var, который мне нужно использовать в users.py

# src/main.py

from flask import Flask
from flask_pymongo import PyMongo

import config
from services import api

app = Flask(__name__)

app.config["MONGO_URI"] = "mongodb://localhost:27017/myApp"
mongo = PyMongo(app)

api.init_app(app)


if __name__ == '__main__':
    app.run(host=config.HOST, port=config.PORT, debug=config.DEBUG)

в сервисах init.py

# src/services/__init__.py
from flask_restx import Api
from .users import api as np_users
import config

api = Api(
    title=config.NAME,
    version=config.VERSION,
    description=config.DESCRIPTION,
)

api.add_namespace(np_users, path='/api/v1/users/users')

И я пытаюсь импортировать mongo var в:

# src/services/users.py

     ...

from main import mongo

api = Namespace('users', description='users')
     ...

Когда я делаю:

python main.py

Это вызывает у меня эту ошибку:

Traceback (последний вызов последним): файл "main.py", строка 7, в from services import api Файл "C: \ myProject \ src \ services_init_.py", строка 6, в from .users import api as ns_users Файл "C:\myProject\src\services\users.py", строка 5, inices\users.py", строка 5, из основного файла импорта mongo"C:\myProject\src\main.py", строка 7, in .py", строка 7, in from services import api end_analisis_prediccion_equipos_b ImportError: невозможно импортировать имя 'api' из 'services' (C:\myProject\ src \services_init_.py)

1 ответ

Решение

Чтобы иметь возможность импортировать mongo из main (main.py), вы должны установить значение mongo перед импортом api из службы. Ваш main.py должен выглядеть так:

from flask import Flask
from flask_pymongo import PyMongo
import config
app = Flask(__name__)
app.config["MONGO_URI"] = "mongodb://localhost:27017/myApp"

mongo = PyMongo(app)

from services import api 

api.init_app(app)

if __name__ == '__main__':
    app.run(host=config.HOST, port=config.PORT, debug=config.DEBUG)

Хотя это будет работать, использование этого шаблона (из основного импорта...) не является хорошей практикой. Вы можете проверить некоторые объяснения здесь.

Другие вопросы по тегам