快速了解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中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
简单实现python聊天程序
Apr 01 Python
python3+PyQt5实现自定义窗口部件Counters
Apr 20 Python
python socket网络编程之粘包问题详解
Apr 28 Python
python 正确保留多位小数的实例
Jul 16 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
Jun 02 Python
完美解决python针对hdfs上传和下载的问题
Jun 05 Python
Python手动或自动协程操作方法解析
Jun 22 Python
Python 开发工具通过 agent 代理使用的方法
Sep 27 Python
解决python存数据库速度太慢的问题
Apr 23 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
3.从实例开始
2006/10/09 PHP
ezSQL PHP数据库操作类库
2010/05/16 PHP
php 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
Yii使用migrate命令执行sql语句的方法
2016/03/15 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
JavaScript使用focus()设置焦点失败的解决方法
2014/09/03 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
JavaScript编写一个贪吃蛇游戏
2017/03/09 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
读懂CommonJS的模块加载
2019/04/19 Javascript
vue项目强制清除页面缓存的例子
2019/11/06 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
Python爬取三国演义的实现方法
2016/09/12 Python
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
python selenium 弹出框处理的实现
2019/02/26 Python
python修改linux中文件(文件夹)的权限属性操作
2020/03/05 Python
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
师范应届毕业生自荐信
2013/11/18 职场文书
大学生演讲稿范文
2014/01/11 职场文书
高校教师自荐信范文
2014/03/13 职场文书
小学生教师节演讲稿
2014/09/03 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书