快速了解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操作mongodb根据_id查询数据的实现方法
May 20 Python
python 对给定可迭代集合统计出现频率,并排序的方法
Oct 18 Python
python中append实例用法总结
Jul 30 Python
python 叠加等边三角形的绘制的实现
Aug 14 Python
Atom Python 配置Python3 解释器的方法
Aug 28 Python
python线程的几种创建方式详解
Aug 29 Python
python全局变量引用与修改过程解析
Jan 07 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
python中return如何写
Jun 18 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
Jul 01 Python
python Gabor滤波器讲解
Oct 26 Python
django项目中使用云片网发送短信验证码的实现
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
Syphon 使用方法
2021/03/03 冲泡冲煮
网友原创的PHP模板类代码
2008/09/07 PHP
mysql,mysqli,PDO的各自不同介绍
2012/09/19 PHP
深入解析PHP的Yii框架中的缓存功能
2016/03/29 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
PHP字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
Node.js 中使用 async 函数的方法
2017/11/20 Javascript
vue一个页面实现音乐播放器的示例
2018/02/06 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
python实现查询IP地址所在地
2015/03/29 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
Python基于Tkinter编写crc校验工具
2020/05/06 Python
基于Python测试程序是否有错误
2020/05/16 Python
Python matplotlib可视化实例解析
2020/06/01 Python
python如何进入交互模式
2020/07/06 Python
三星印度官网:Samsung印度
2019/08/03 全球购物
护士岗前培训自我评鉴
2014/02/28 职场文书
初中英语演讲稿
2014/04/29 职场文书
班级年度安全计划书
2014/05/01 职场文书
乡镇个人对照检查材料
2014/08/22 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
SqlServer: 如何更改表的文件组?(进而改变存储位置)
2021/04/05 SQL Server
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server
分析并发编程之LongAdder原理
2021/06/29 Java/Android