快速了解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 Web框架Flask下网站开发入门实例
Feb 08 Python
使用Python脚本来控制Windows Azure的简单教程
Apr 16 Python
Python中装饰器兼容加括号和不加括号的写法详解
Jul 05 Python
Python制作词云的方法
Jan 03 Python
python3.X 抓取火车票信息【修正版】
Jun 19 Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 Python
解决pytorch-yolov3 train 报错的问题
Feb 18 Python
django迁移文件migrations的实现
Mar 31 Python
keras得到每层的系数方式
Jun 15 Python
深入浅析python 中的self和cls的区别
Jun 20 Python
详解Python中的路径问题
Sep 02 Python
python-jwt用户认证食用教学的实现方法
Jan 19 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 高手之路(二)
2006/10/09 PHP
php桌面中心(四) 数据显示
2007/03/11 PHP
PHP中使用数组实现堆栈数据结构的代码
2012/02/05 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
新浪微博字数统计 textarea字数统计实现代码
2011/08/28 Javascript
利用jquery的获取JS文件中的字符串内容
2012/02/14 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
JS控制一个DIV层在指定时间内消失的方法
2014/02/17 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
javascript基于prototype实现类似OOP继承的方法
2015/12/16 Javascript
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
angular分页指令操作
2017/01/09 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
JavaScript类的继承方法小结【组合继承分析】
2018/07/11 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
python基于物品协同过滤算法实现代码
2018/05/31 Python
浅谈DataFrame和SparkSql取值误区
2018/06/09 Python
Python中的CSV文件使用"with"语句的方式详解
2018/10/16 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
parser.add_argument中的action使用
2020/04/20 Python
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
html5自动播放mov格式视频的实例代码
2020/01/14 HTML / CSS
总裁秘书岗位职责
2013/12/04 职场文书
临床医师个人自我评价
2014/04/06 职场文书
小学开学标语
2014/07/01 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
《有余数的除法》教学反思
2016/02/22 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL