开发者社区 问答 正文

ipython NameError,找不到类

这就是遇到问题的app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

mysql://username:password@server:portnumber/database
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@127.0.0.1:3306/flask_sql'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)

class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)

    us = db.relationship('User', backref='role')

    def __repr__(self):
        return 'Role:%s %s'% (self.name,self.id)

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, index=True)
    email = db.Column(db.String(64),unique=True)
    password = db.Column(db.String(64))
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

    def __repr__(self):
        return "<User:%s,%s,%s,%s>"%(self.id,self.name,self.email,self.password)

if __name__ == '__main__':
    db.drop_all()
    db.create_all()

    ro1 = Role(name='admin')
    db.session.add(ro1)
    db.session.commit()
    ro2 = Role(name='user')
    db.session.add(ro2)
    db.session.commit()

    us1 = User(name='wang', email='wang@163.com', password='123456', role_id=ro1.id)
    us2 = User(name='zhang', email='zhang@189.com', password='201512', role_id=ro2.id)
    us3 = User(name='chen', email='chen@126.com', password='987654', role_id=ro2.id)
    us4 = User(name='zhou', email='zhou@163.com', password='456789', role_id=ro1.id)
    us5 = User(name='tang', email='tang@itheima.com', password='158104', role_id=ro2.id)
    us6 = User(name='wu', email='wu@gmail.com', password='5623514', role_id=ro2.id)
    us7 = User(name='qian', email='qian@gmail.com', password='1543567', role_id=ro1.id)
    us8 = User(name='liu', email='liu@itheima.com', password='867322', role_id=ro1.id)
    us9 = User(name='li', email='li@163.com', password='4526342', role_id=ro2.id)
    us10 = User(name='sun', email='sun@163.com', password='235523', role_id=ro2.id)
    db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10])
    db.session.commit()

    db.session.delete(us2)
    db.session.commit()

    app.run(debug=True)

这是ipython错误:

(Flask_py) F:\Python\project>ipython
f:\python\python36_64\lib\site-packages\IPython\core\interactiveshell.py:925: UserWarning
: Attempting to work in a virtualenv. If you encounter problems, please install IPython i
nside the virtualenv.
  warn("Attempting to work in a virtualenv. If you encounter problems, please "
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.10.2 -- An enhanced Interactive Python. Type '?' for help.


In [1]: from Flask_SQLAlchemy import *

In [2]: role = Role(name='admin')
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-1175ee0e3695> in <module>
----> 1 role = Role(name='admin')

NameError: name 'Role' is not defined

我可以在python代码中使用Role类,并且可以成功地查询数据,但是在ipython中,这个类是无法识别的。我在哪个目录下输入ipython很重要,还是在哪个virtualenv目录下输入ipython很重要?我所在的目录是forder,比项目forder高一层,而我所在的virtualenv是我用于项目的env。请帮助我。谢谢你! 问题来源StackOverflow 地址:/questions/59383665/an-ipython-nameerror-couldnt-find-a-class

展开
收起
kun坤 2019-12-27 10:12:15 483 分享 版权
阿里云 AI 助理回答

在你的问题中,你提到在Python代码中可以正常使用Role类,但在IPython环境中却遇到NameError: name 'Role' is not defined的错误。这通常意味着IPython没有正确加载或找不到定义Role类的模块。

有几个可能的原因和解决方法:

  1. 虚拟环境不匹配:确保你在运行IPython时激活的是与你的项目相同的虚拟环境。根据你的描述,你已经在一个正确的虚拟环境下工作,但还是确认一下是否确实激活了(比如命令行前缀有(Flask_py)这样的标识)。

  2. 导入方式不正确:在你的IPython会话中,你使用了from Flask_SQLAlchemy import *来尝试导入所有内容。这里的问题可能是模块名大小写不敏感导致的。Python是大小写敏感的,而你的文件名是app.py,且按照Flask应用的常规结构,你应该从实际的模块导入而不是直接从一个未明确指出的Flask_SQLAlchemy导入。正确的做法应该是先导入你的应用模块,比如如果app.py位于项目目录下,你可以尝试:

    import sys
    sys.path.append('path_to_your_project_folder')  # 替换为你的项目路径
    from app import Role
    

    确保替换path_to_your_project_folder为你的项目所在的实际路径。

  3. 工作目录问题:虽然你提到当前目录比项目目录高一层,但这通常不是直接导致类无法识别的原因,因为通过正确导入应该能够访问到。不过,确保你的工作目录设置正确对于避免路径相关的问题是有帮助的。如果你的项目结构中有包的概念(即存在__init__.py文件),确保你的导入路径反映了这一点。

  4. 虚拟环境激活与目录位置:理论上,只要你在正确的虚拟环境中,无论在哪个目录下启动IPython(当然,需要能访问到项目代码),都应该能够正常导入模块。但是,有时候IDE或终端的行为可能会受当前工作目录影响,尤其是当涉及到相对路径导入时。因此,尽管这不是直接原因,但确保你的工作目录不会引入额外的导入路径问题也是好的实践。

综上所述,首先检查并确保虚拟环境正确激活,然后使用正确的导入语句来导入你的类。如果问题依旧,考虑是否有其他环境配置或路径问题干扰了正常的导入过程。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答