快速了解Python相对导入


Posted in Python onJanuary 12, 2018

1、绝对导入和相对导入

绝对导入:按照sys.path顺序搜索,先主目录(sys.path中第一项''),然后PYTHONPATH环境变量、标准库路径、pth指定路径等。

相对导入:在模块所在同一个包内搜索,注意该包目录与主目录的区别。

例1:有以下目录

app/
    __init__.py
    mod.py
    string.py

mod.py内容:import string

当在app/目录下执行Python mod.py时为绝对导入,当在app上层目录执行python -m app.mod时为相对导入。

2、在python 2.7及之前版本中默认是先“相对”后“绝对”的顺序搜索模块,也就是说先在模块所在同一个包内搜索然后在sys.path中搜索。

在上例中,在app上层目录执行python -m app.mod时,将导入app/string.py(可以在string.py中print或者在mod.py中加入print string.__file__来测试)。

使用以下语句将会只搜索绝对路径:

from __future__ import absolute_import

在mod.py开头加上该语句,在app上层目录执行python -m app.mod时,将导入标准库中的string模块。

在python3.3中默认只搜索绝对路径,要使用相对导入,执行以下语句:

from . import string

注意:开头点号只能用在from语句中,不能用在import语句中。

3、相对导入使用模块的__name__属性来决定模块在包结构中的位置。当__name__属性不包含包信息(i.e. 没有用'.'表示的层次结构,比如'__main__'),则相对导入将模块解析为顶层模块,而不管模块在文件系统中的实际位置。

例2:

app/
    __init__.py
    sub1/
         __init__.py
         mod1.py
     sub2/
         __init__.py
         mod2.py

尝试在mod1.py导入mod2.py,加入from ..sub2 import mod2。

直接在sub1目录下执行python mod1.py或在app目录下执行python sub1/mod1.py将报错:"Attempted relative import in non-package"。

在app目录下执行python -m sub1.mod1也将报错:"Attempted relative import beyond toplevel package"。

正确的做法是:在app上层目录执行python -m app.sub1.mod1,或者不要使用from ..sub2 import mod2而改用其他方式(比如将sub2添加到sys.path)。

例3:

__init__.py
start.py
parent.py
sub/
    __init__.py
    relative.py

start.py中包含import sub.relative,relative.py中包含from .. import parent。

执行python start.py将报错:"Attempted relative import beyond toplevel package"。

解决办法:新建pkg目录,将parent.py、sub目录移到pkg目录中,start.py改为import pkg.sub.relative,其它不变。

总结

以上就是本文关于快速了解Python相对导入的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python服务器与android客户端socket通信实例
Nov 12 Python
Python中关于使用模块的基础知识
May 24 Python
详解python OpenCV学习笔记之直方图均衡化
Feb 08 Python
对python中执行DOS命令的3种方法总结
May 12 Python
Python Requests库基本用法示例
Aug 20 Python
python实现简易数码时钟
Feb 19 Python
Django实现文件上传和下载功能
Oct 06 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
python数据预处理 :数据共线性处理详解
Feb 24 Python
python实现录屏功能(亲测好用)
Mar 02 Python
matplotlib subplot绘制多个子图的方法示例
Jul 28 Python
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 Python
Python实现翻转数组功能示例
Jan 12 #Python
Python实现求数列和的方法示例
Jan 12 #Python
python+matplotlib演示电偶极子实例代码
Jan 12 #Python
Python实现读取及写入csv文件的方法示例
Jan 12 #Python
python+matplotlib绘制旋转椭圆实例代码
Jan 12 #Python
使用C++扩展Python的功能详解
Jan 12 #Python
聊聊Python中的pypy
Jan 12 #Python
You might like
PHP如何抛出异常处理错误
2011/03/02 PHP
基于simple_html_dom的使用小结
2013/07/01 PHP
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
AJAX在JQuery中的应用详解
2019/01/30 jQuery
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
python微信公众号之关键词自动回复
2018/06/15 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
Tensorflow实现酸奶销量预测分析
2019/07/19 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
python中怎么表示空值
2020/06/19 Python
安装python依赖包psycopg2来调用postgresql的操作
2021/01/01 Python
CSS3 实现的加载动画
2020/12/07 HTML / CSS
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
如何开发一个JQuery插件
2016/07/28 面试题
车间主管岗位职责
2013/11/14 职场文书
应届毕业生求职信
2013/11/30 职场文书
村委会贫困证明
2014/01/14 职场文书
规划编制实施方案
2014/03/15 职场文书
环保建议书400字
2014/05/14 职场文书
2015关爱留守儿童工作总结
2014/12/12 职场文书
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript