快速了解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数据结构之顺序表的实现代码示例
Nov 15 Python
微信跳一跳python辅助脚本(总结)
Jan 11 Python
python re模块的高级用法详解
Jun 06 Python
python把1变成01的步骤总结
Feb 27 Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 Python
python读取图像矩阵文件并转换为向量实例
Jun 18 Python
Python如何解除一个装饰器
Aug 07 Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 Python
Python实现为PDF去除水印的示例代码
Apr 03 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
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
jQuery AJAX 调用WebService实现代码
2010/03/24 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
IE无法设置短域名下Cookie
2010/09/23 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
基于javascript实现动态显示当前系统时间
2016/01/28 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
python合并同类型excel表格的方法
2018/04/01 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
python 将对象设置为可迭代的两种实现方法
2019/01/21 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
利用python实现汉诺塔游戏
2021/03/01 Python
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
教师年度考核自我鉴定
2014/01/19 职场文书
初中学生期末评语
2014/04/24 职场文书
2014年青年教师工作总结
2014/12/17 职场文书