设为首页收藏本站
查看: 80|回复: 0

[PHP] Python中import导入上一级目录模块及循环import问题

[复制链接]

论坛元老

Rank: 6Rank: 6

积分
34274
主题
17031
UID
1347
M币
67
贡献
17176

  • 发表于 2017-5-14 02:44:00 | 显示全部楼层 |阅读模式
    import上一级目录的模块
    python中,import module会去sys.path搜索,sys.path是个列表,并且我们可以动态修改。
    要import某个目录的module,我们sys.path.insert(0,somedir)来加入搜索路径,就可以import了。
    既然这样,要import上一级目录的module,可以sys.path.insert(0,parentdir)。
    不过这种写绝对路径的方式,如果文件放到其它地方,就不行了。
    所以用动态方法来获取上一级目录。

    import os,sys parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0,parentdir)
    为什么用sys.path.insert(0,parentdir) 而不是用sys.path.append(parentdir)呢
    因为是遍历搜索路径的,所以如果在其它路径里也有个同名的module,会import错。用sys.path.insert(0,parentdir)可以确保先搜索这个路径。
    解决循环import的问题
    在python中常常会遇到循环import即circular import的问题。
    现实中经常出现这种滑稽的情况,
    安装无线网卡的时候,需要上网下载网卡驱动..
    安装压缩软件的时候,从网上下载的压缩软件安装程序居然是被压缩了的..
    循环依赖就类似于这种情况。
    举个栗子,
    在models.py中,

    from server import db class User(db.Model): pass
    在server.py中,

    from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' db = SQLAlchemy(app) from models import User
    这样就产生了循环import的问题。
    解决循环import的方法主要有几种。
    1.延迟导入(lazy import)
    即把import语句写在方法或函数里面,将它的作用域限制在局部。
    这种方法的缺点就是会有性能问题。
    2.将from xxx import yyy改成import xxx;xxx.yyy来访问的形式
    3.组织代码
    出现循环import的问题往往意味着代码的布局有问题。
    可以合并或者分离竞争资源。
    合并的话就是都写到一个文件里面去。
    分离的话就是把需要import的资源提取到一个第三方文件去。
    总之就是将循环变成单向。
    更多Python中import导入上一级目录模块及循环import问题相关文章请关注PHP中文网!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    在我站开通SVIP可同时获得17个站点VIP资源 立即登录 立即注册
    快速回复 返回顶部 返回列表