快速了解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正则表达式的使用范例详解
Aug 08 Python
Python生成验证码实例
Aug 21 Python
Python的__builtin__模块中的一些要点知识
May 02 Python
python 读写、创建 文件的方法(必看)
Sep 12 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
Python入门_学会创建并调用函数的方法
May 16 Python
Python读取word文本操作详解
Jan 22 Python
详解Django中六个常用的自定义装饰器
Jul 04 Python
Tensorflow 同时载入多个模型的实例讲解
Jul 27 Python
python 抓包保存为pcap文件并解析的实例
Jul 23 Python
Django Rest framework认证组件详细用法
Jul 25 Python
快速解决vue.js 模板和jinja 模板冲突的问题
Jul 26 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 date函数参数详解
2006/11/27 PHP
php使用session二维数组实例
2014/11/06 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
PHP缩略图生成和图片水印制作
2017/01/07 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
python遍历类中所有成员的方法
2015/03/18 Python
Python赋值语句后逗号的作用分析
2015/06/08 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
python3注册全局热键的实现
2020/03/22 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
在校生钳工实习自我鉴定
2013/09/19 职场文书
面试后感谢信
2014/02/01 职场文书
学生党员一帮一活动总结
2014/07/08 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
在校学生证明格式
2015/06/24 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS