V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ysicing
V2EX  ›  Python

Python import 问题

  •  
  •   ysicing ·
    ysicing · 2017-03-23 00:03:23 +08:00 · 2649 次点击
    这是一个创建于 2602 天前的主题,其中的信息可能已经有所发展或是发生改变。
    app/__init__.py
    ...
    from flask_redis import FlaskRedis
    from flask_login import LoginManager
    import os
    ...
    login_manager = LoginManager()
    login_manager.session_protection = 'strong'
    login_manager.login_view = 'auth.oauth'
    
    def create_app(config="app.config"):
        app = Flask(__name__)
        with app.app_context():
            app.config.from_object(config)
    ...
            redis_store = FlaskRedis()
            redis_store.init_app(app)
            login_manager.init_app(app)
    ...
    ----
    
    app/models.py
    
    from . import login_manager
    

    但是这样 import 会报错 ImportError: cannot import name 'login_manager' 参考了 Flask Web 开发一书

    第 1 条附言  ·  2017-03-23 00:57:10 +08:00

    版本Python 3.6 启动 run.py

    from app import create_app
    app = create_app()
    
    app.run(host="0.0.0.0",port=4000,debug=app.debug, threaded=True)
    
    第 2 条附言  ·  2017-03-23 01:17:22 +08:00
    9 条回复    2017-03-23 12:47:14 +08:00
    billlee
        1
    billlee  
       2017-03-23 00:09:46 +08:00
    我不能重现,你需要把你启动程序的方式说一下
    terence4444
        2
    terence4444  
       2017-03-23 00:23:43 +08:00
    这种情况不用 from 直接 import login_manager 就可以了,但 from 用包相对路径我这的确也不行,不知道怎么搞。
    freestyle
        3
    freestyle  
       2017-03-23 00:41:49 +08:00 via iPhone
    Python 相关的问题得写 py2 还是 py3 啊大兄弟
    ysicing
        4
    ysicing  
    OP
       2017-03-23 01:07:20 +08:00
    @terence4444 直接 import 也不行的
    ysicing
        5
    ysicing  
    OP
       2017-03-23 01:17:51 +08:00
    lt0136
        6
    lt0136  
       2017-03-23 01:19:13 +08:00 via Android
    有循环导入的问题。。
    把所有 import 自己代码的地方比如 blueprint 放在 creat_app()里面
    能放后面就放后面
    仔细分析一下包的导入过程你就知道为啥了。。
    ysicing
        7
    ysicing  
    OP
       2017-03-23 01:42:51 +08:00 via Android
    @lt0136 哦哦,我琢磨琢磨
    zsz
        8
    zsz  
       2017-03-23 02:00:31 +08:00
    @ysicing 解决循环引用就好了, 尽量整理好导入的模块关系


    有问题可以加我们的群问,这样效率更高,这个群是一群工程师组建的面向初学者的
    Python Linux 学习群, qq 群号: 278529278 ,
    Php Linux 学习群, qq 群号: 476648701 ,
    非商业性质,拒绝广告,只接收真正想学这方面技术的朋友,交流学习,申请请说明来自 v2ex
    ap010gi2e
        9
    ap010gi2e  
       2017-03-23 12:47:14 +08:00
    我感觉题主是想问 from...import...的相对导入问题。当要在 python 中使用相对导入模块,对目录结构是有要求的。
    一、执行相对导入的模块(.py )文件不能作为顶层模块执行该文件夹中的 py 文件的。
    二、相对导入的文件夹必须要被 python 解释器理解为包的(也就是必须要包含__init__.py )文件。
    同时满足上述两个条件,才可以进行 from import 的相对导入模块的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   951 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:00 · PVG 05:00 · LAX 14:00 · JFK 17:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.