快速了解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中的zip函数使用示例
Jan 29 Python
利用Python绘制数据的瀑布图的教程
Apr 07 Python
python使用xlrd模块读写Excel文件的方法
May 06 Python
Python的装饰器用法学习笔记
Jun 24 Python
python+pygame简单画板实现代码实例
Dec 13 Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 Python
python 图片去噪的方法示例
Jul 09 Python
tensor和numpy的互相转换的实现示例
Aug 02 Python
使用NumPy读取MNIST数据的实现代码示例
Nov 20 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
python,Java,JavaScript实现indexOf
Sep 09 Python
Python自动化测试基础必备知识点总结
Feb 07 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
Yii2增加验证码步骤详解
2016/04/25 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
php swoft框架实例用法
2020/12/22 PHP
js 判断脚本加载完毕的代码
2011/07/13 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
JS中如何设置readOnly的值
2013/12/25 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
学习JavaScript设计模式之责任链模式
2016/01/18 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
Python编程中的异常处理教程
2015/08/21 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
Python调用系统底层API播放wav文件的方法
2017/08/11 Python
python实现二叉树的遍历
2017/12/11 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
python通过实例讲解反射机制
2019/10/17 Python
python超时重新请求解决方案
2019/10/21 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
教师中国梦演讲稿
2014/04/23 职场文书
学校校庆演讲稿
2014/05/22 职场文书
小区推广策划方案
2014/06/06 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
用python实现监控视频人数统计
2021/05/21 Python
Python基于百度AI实现抓取表情包
2021/06/27 Python