我有一个要导入类的文件。结构如下:
- models\
-- User.py
-- Role.py
app.py
文件User.py
如下所示:
from flask_security import UserMixin
from app import db
class User(db.Model, UserMixin):
roles_users = db.Table('roles_users',
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='dynamic'))
def __repr__(self):
return '<User %r>' % self.username
在我的app.py
中,我这样做:
from models.User import User
然后我得到一个错误
Traceback (most recent call last):
File "/var/app/app.py", line 7, in <module>
from models.User import User
File "/var/app/models/User.py", line 2, in <module>
from app import db
File "/var/app/app.py", line 7, in <module>
from models.User import User
ImportError: cannot import name 'User'
我该怎么办?当我在User
中声明类app.py
时,一切正常。
答案 0 :(得分:0)
问题在于模型是一个目录,而python不会将其解释为一个包,因此您无法从其中导入任何内容,要解决该问题,您应该在名为__init__.py
的模型中创建一个新文件应该为空,此Python会将您的模型识别为包
您的目录结构应如下所示:
- model/
|__ __init__.py
|__ User.py
|__ Role.py
- app.py
您可以导入它们,他们可以阅读有关此here
的更多信息答案 1 :(得分:0)
现在我看到了您的问题,第一次没有注意User.py代码,但是您的问题是您尝试从app.py
文件导入到User.py
文件,但从User.py
还会尝试从app.py
文件中导入某些“ db”,这会导致问题,您首先创建一个递归,第二次在系统中找不到app.py
。因此,在导入User.py
时会尝试导入app.py
,但找不到app.py
。
要解决此问题,您应该加倍sys.path
项目的路径,然后加一个__init__.py
文件,以便您可以按所需的方式执行导入,但是我建议您尝试导入数据库从另一种方式。
但是您可以这样做:
-your_project/
|- app.py
|- __init__.py
|- model/
|- __init__.py
|- User.py
|- another.py
他们你尝试:
用yourse的python inse打开一个终端
>>> import sys
>>> sys.path.insert(0, '../')
>>> import app
在app.py中输入代码from model.User import User
,在User.py from your_project.app import db
中输入代码
但是我建议不要采用这种方式,最好是对项目进行良好的结构调整并避免这些不便之处