快速了解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开启多个子进程并行运行的方法
Apr 18 Python
Python开发如何在ubuntu 15.10 上配置vim
Jan 25 Python
python套接字流重定向实例汇总
Mar 03 Python
Python学习之用pygal画世界地图实例
Dec 07 Python
matlab中实现矩阵删除一行或一列的方法
Apr 04 Python
使用python 3实现发送邮件功能
Jun 15 Python
pygame实现雷电游戏雏形开发
Nov 20 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
Feb 25 Python
Python 将 QQ 好友头像生成祝福语的实现代码
May 03 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
May 13 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 Python
Python基础详解之邮件处理
Apr 28 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中使用Oracle数据库(2)
2006/10/09 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
2014/07/04 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
PHP多态代码实例
2015/06/26 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
Knockoutjs的环境搭建教程
2012/11/26 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
基于AngularJS实现iOS8自带的计算器
2016/09/12 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
nodejs实现发出蜂鸣声音(系统报警声)的方法
2017/01/18 NodeJs
解决给dom元素绑定click等事件无效问题的方法
2017/02/17 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
js控制随机数生成概率代码实例
2019/03/21 Javascript
vue+springboot图片上传和显示的示例代码
2020/02/14 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
python基础教程之字典操作详解
2014/03/25 Python
分享15个最受欢迎的Python开源框架
2014/07/13 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
完美解决IE8下不兼容rgba()的问题
2017/03/31 HTML / CSS
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
人工作失职检讨书
2015/05/05 职场文书
校长一岗双责责任书
2015/05/09 职场文书
婚宴新郎致辞
2015/07/28 职场文书
会计手工模拟做账心得体会
2016/01/22 职场文书
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
提高系统的吞吐量解决数据库重复写入问题
2022/04/23 MySQL