Невозможно импортировать 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)
Хотя это будет работать, использование этого шаблона (из основного импорта...) не является хорошей практикой. Вы можете проверить некоторые объяснения здесь.