快速了解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使用xmlrpclib模块实现对百度google的ping功能
Jun 02 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
python 动态加载的实现方法
Dec 22 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
Python3.7 dataclass使用指南小结
Feb 22 Python
Python语法分析之字符串格式化
Jun 13 Python
Python整数对象实现原理详解
Jul 01 Python
查看已安装tensorflow版本的方法示例
Apr 19 Python
python爬虫实例之获取动漫截图
May 31 Python
python实现凯撒密码、凯撒加解密算法
Jun 11 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 Python
Django+Django-Celery+Celery的整合实战
Jan 20 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+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
浅析php header 跳转
2013/06/17 PHP
php时区转换转换函数
2014/01/07 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
学习YUI.Ext 第七天--关于View&JSONView
2007/03/10 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
AngularJS通过$http和服务器通信详解
2016/09/21 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
2017/10/19 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
在layui tab控件中载入外部html页面的方法
2019/09/04 Javascript
Vue-CLI与Vuex使用方法实例分析
2020/01/06 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
初学python数组的处理代码
2011/01/04 Python
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
深入讲解Java编程中类的生命周期
2016/02/05 Python
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
详解canvas.toDataURL()报错的解决方案全都在这了
2020/03/31 HTML / CSS
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
2015年汽车销售工作总结
2015/04/07 职场文书
培根随笔读书笔记
2015/07/01 职场文书
班委竞选稿范文
2015/11/21 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
redis cluster支持pipeline的实现思路
2021/06/23 Redis