首页 > 解决方案 > ImportError:无法从“模块”导入名称“变量”

问题描述

我将 Flask 用于我的 Web 框架。我遇到了进口问题。我不明白为什么我在我的声明中不能导入我的变量my_app/__init__.py

from flask import Flask
from flask_login import LoginManager
from my_app.some_module.my_class.py import auth


app = Flask(__name__)
login_manager = LoginManager()

class Config:
    def __init__(self):
        pass

config = Config()

我的冲突进口存在于my_app/some_module/my_class.py

from flask import Blueprint
from my_app import login_manager  # this one works fine
from my_app import config

auth = Blueprint('auth', __name__)

我运行应用程序run.py

from my_app import app
app.run(debug=True)

然后我得到错误:

Traceback (most recent call last):
  ...
  File ".../my_app/some_module/my_class.py", line 1, in <module>
    from my_app import login_manager, config
ImportError: cannot import name 'config' from 'my_app' (.../my_app/__init__.py)

项目结构为:

my_app
  + __init__.py
  some_module
    + __init__.py
    + my_class.py
+ run.py

标签: python

解决方案


你有一个循环导入:my_app.some_module-> my_app.some_module.my_class-> my_app.some_module

您可以通过将Configconfig移至单独的模块来解决此问题my_app.some_module.config

# my_app.some_module.my_config
class Config:
    pass

config = Config()

# my_app.some_module.my_class
from .my_config import config

# my_app.some_module.__init__
from .my_config import config
from .my_class import MyClass

这意味着每次导入都不依赖于先前的导入:

my_app.some_module
|-> my_app.some_module.my_class -> my_app.some_module.config
\-> my_app.some_module.my_config

以这种方式进行导入而不是将导入移动.my_class到末尾__init__.py更健壮。您可以自由地重新排序文件的导入.my_class.my_config文件的顶部。


推荐阅读