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的id()函数介绍
Feb 10 Python
Python语言实现将图片转化为html页面
Dec 06 Python
Numpy数组的保存与读取方法
Apr 04 Python
python3+opencv3识别图片中的物体并截取的方法
Dec 05 Python
Python高斯消除矩阵
Jan 02 Python
python之线程通过信号pyqtSignal刷新ui的方法
Jan 11 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
Sep 20 Python
完美解决pycharm导入自己写的py文件爆红问题
Feb 12 Python
Python之字典添加元素的几种方法
Sep 30 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
Dec 01 Python
如何用python批量调整视频声音
Dec 22 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
PHP之密码加密的几种方式
2015/07/29 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
jquery得到font-size属性值实现代码
2013/09/30 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
JQuery仿小米手机抢购页面倒计时效果
2014/12/16 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
node+vue实现文件上传功能
2020/05/28 Javascript
[01:14]3.19DOTA2发布会 三代刀塔人第二代
2014/03/25 DOTA
简述Python中的面向对象编程的概念
2015/04/27 Python
python创建列表并给列表赋初始值的方法
2015/07/28 Python
python跳出双层for循环的解决方法
2019/06/24 Python
python使用HTMLTestRunner导出饼图分析报告的方法
2019/12/30 Python
python实现贪吃蛇游戏源码
2020/03/21 Python
使用python从三个角度解决josephus问题的方法
2020/03/27 Python
python判断变量是否为列表的方法
2020/09/17 Python
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
linux下进程间通信的方式
2013/01/23 面试题
市场推广策划方案
2014/06/02 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
教师工作表现评语
2014/12/31 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
Nginx源码编译安装过程记录
2021/11/17 Servers
Vue的生命周期一起来看看
2022/02/24 Vue.js