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 splitlines使用技巧
Sep 06 Python
Python基本数据类型详细介绍
Mar 11 Python
浅谈Python中列表生成式和生成器的区别
Aug 03 Python
使用Python生成XML的方法实例
Mar 21 Python
python中利用xml.dom模块解析xml的方法教程
May 24 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
python自动化测试之如何解析excel文件
Jun 27 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
详解Python self 参数
Aug 30 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
pytorch 批次遍历数据集打印数据的例子
Dec 30 Python
Python语法之精妙的十个知识点(装B语法)
Jan 18 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
农民C键的运用技巧
2020/03/04 星际争霸
中东人咖啡哲学
2021/03/03 咖啡文化
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
JQuery 常用方法基础教程
2009/02/06 Javascript
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
jquery 面包屑导航 具体实现
2013/06/05 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
值得分享的Bootstrap Table使用教程
2016/11/23 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
Vue中如何实现轮播图的示例代码
2017/07/27 Javascript
JS监听滚动和id自动定位滚动
2018/12/18 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
Python实现全角半角转换的方法
2014/08/18 Python
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
python去除文件中重复的行实例
2018/06/29 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
Python Collatz序列实现过程解析
2019/10/12 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
大学生求职简历的自我评价范文
2013/10/12 职场文书
电气工程师岗位职责
2014/01/01 职场文书
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
2014年销售人员工作总结
2014/11/27 职场文书
会计岗位职责范本
2015/04/02 职场文书
电力工程合作意向书
2015/05/11 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
2016大一新生军训感言
2015/12/08 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android