无法从其他文件导入类

时间:2018-06-28 17:46:33

标签: python

我有一个要导入类的文件。结构如下:

- 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时,一切正常。

2 个答案:

答案 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中输入代码

但是我建议不要采用这种方式,最好是对项目进行良好的结构调整并避免这些不便之处