Python中import导入上一级目录模块及循环import问题的解决


Posted in Python onJune 04, 2016

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 相关文章推荐
Python正则获取、过滤或者替换HTML标签的方法
Jan 28 Python
Windows系统下多版本pip的共存问题详解
Oct 10 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 Python
python3调用R的示例代码
Feb 23 Python
matplotlib 输出保存指定尺寸的图片方法
May 24 Python
python 批量修改/替换数据的实例
Jul 25 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
Jan 29 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
Aug 02 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
Apr 09 Python
在keras下实现多个模型的融合方式
May 23 Python
python 基于Apscheduler实现定时任务
Dec 15 Python
Python输出汉字字库及将文字转换为图片的方法
Jun 04 #Python
使用Python的Flask框架来搭建第一个Web应用程序
Jun 04 #Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 #Python
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 #Python
详解字典树Trie结构及其Python代码实现
Jun 03 #Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 #Python
Python中的descriptor描述器简明使用指南
Jun 02 #Python
You might like
Yii2验证器(Validator)用法分析
2016/07/23 PHP
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
2015/12/28 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
2016/11/22 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
详解vue-cli中使用rem,vue自适应
2019/05/06 Javascript
Vue函数式组件-你值得拥有
2019/05/09 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
python实现将html表格转换成CSV文件的方法
2015/06/28 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
Python构建XML树结构的方法示例
2017/06/30 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
利用python汇总统计多张Excel
2020/09/22 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
高中学生评语大全
2014/04/25 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
先进个人事迹材料
2014/12/29 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
辞职信标准格式
2015/02/27 职场文书
机器人总动员观后感
2015/06/09 职场文书
红色革命电影观后感
2015/06/18 职场文书
爱国影片观后感
2015/06/18 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers