ModuleNotFoundError Не удается импортировать из app.__init__.py

#python #python-3.x #flask #flask-restful

#python #python-3.x #колба #колба-restful

Вопрос:

Я пытаюсь настроить приложение flask, которое работает на Python 3.7.x. Я ссылался на множество онлайн-руководств, но, похоже, не могу разрешить эту ошибку ModuleNotFoundError, и ни один из вопросов stackoverflow не связан.

Ниже приведена структура моего проекта:

 project/
    app/
        __init__.py
        api.py
        conf.py
        models.py
        schema.py
    orders-mgmt.toml
    requirements.txt
    README.md
 
 # app/__init__.py

from flask import Flask
from flask_restful import Api
from app.conf import load_from_toml
import logging
import os.path

if os.path.isfile('/opt/project/orders-mgmt.toml'):
    config = load_from_toml('/opt/project/orders-mgmt.toml')
else:
    config = load_from_toml()

app = Flask(__name__)
api = Api(app)

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = config['mysql']['db_uri']
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
    'pool_recycle': 3000,
    'pool_pre_ping': True,
}
 
 # app/api.py

from flask import jsonify
from flask_restful import Resource
from flask_sqlalchemy import SQLAlchemy
from app import app, api, config #ERROR here
from app.models import Request
from app.schema import RequestSchema

db = SQLAlchemy(app)


class TestGet(Resource):

    def get(self):
        return 'okay'


api.add_resource(TestGet, '/')

if __name__ == '__main__':
    app.run(debug=True, host='localhost', port=5000)
 

Я получаю ModuleNotFoundError входящую app/api.py строку from app import app, api, config при запуске python app/api.py :

 $ python app/api.py
Traceback (most recent call last):
  File "app/api.py", line 4, in <module>
    from app import app, api, config
ModuleNotFoundError: No module named 'app'
 

Могу ли я узнать, в чем проблема с моим приложением flask?

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

1. Должен входить только код инициализации пакета __init__.py . Поскольку вы не используете app как пакет, он должен быть пустым или вообще отсутствовать.

Ответ №1:

У вас проблема с циклической зависимостью, ваше приложение не будет работать в такой структуре файлов, удалите логику из модуля инициализации в другой, или вам нужно будет удалить весь абсолютный импорт (импорт для ваших собственных модулей) и заменить их относительным

для __init__ модуля

замените эту строку:

 from app.conf import load_from_toml
 

с

 
from .conf import load_from_toml
 

для app модуля

замените эти строки:

 from app import app, api, config #ERROR here
from app.models import Request
from app.schema import RequestSchema
 

с

 from . import app, api, config
from .models import Request
from .schema import RequestSchema
 

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

1. Я получаю ImportError: cannot import name 'app' from '__main__' из строки from . import app, api, config

2. @kaiilim Я предлагаю вам изменить структуру проекта. Удалите всю логику из __init__ модуля и поместите в app/app.py модуль. Оставьте __init__ модуль просто пустым