繁体   English   中英

ImportError:无法从“模块”导入名称“变量”

[英]ImportError: cannot import name 'variable' from 'module'

我将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

问题是您具有循环依赖性。 到从my_app.some_module.my_class.py导入auth ,您的config尚未设置。 尝试将导入导入移动到my_app/__init__.py文件的末尾,如下所示:

from flask import Flask
from flask_login import LoginManager


app = Flask(__name__)
login_manager = LoginManager()

class Config:
    pass

config = Config()

from my_app.some_module.my_class.py import auth

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

您可以通过将Configconfig都移动到单独的模块my_app.some_module.config来解决此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的导入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM