快速了解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处理大数字的方法
May 27 Python
django自带的server 让外网主机访问方法
May 14 Python
python爬取网易云音乐评论
Nov 16 Python
详解js文件通过python访问数据库方法
Mar 03 Python
详解Python 解压缩文件
Apr 09 Python
python 实现创建文件夹和创建日志文件的方法
Jul 07 Python
Python实用库 PrettyTable 学习笔记
Aug 06 Python
python os.path.isfile()因参数问题判断错误的解决
Nov 29 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
Dec 14 Python
python爬取豆瓣电影排行榜(requests)的示例代码
Feb 18 Python
总结python多进程multiprocessing的相关知识
Jun 29 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 empty函数 使用说明
2009/08/10 PHP
php 归并排序 数组交集
2011/05/10 PHP
php简单防盗链实现方法
2015/07/29 PHP
javascript 二维数组的实现与应用
2010/03/16 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
详解Angular 4.x 动态创建组件
2017/04/25 Javascript
vue 开发一个按钮组件的示例代码
2018/03/27 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
Python中关于浮点数的冷知识
2019/09/22 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
2019/09/29 Python
详解Django配置优化方法
2019/11/18 Python
Python发送邮件实现基础解析
2020/08/14 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
捷克体育用品购物网站:D-sport
2017/12/28 全球购物
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
如何写你的创业计划书
2014/01/07 职场文书
中学教师管理制度
2014/01/14 职场文书
电大会计学自我鉴定
2014/02/06 职场文书
在校大学生的职业生涯规划书
2014/03/14 职场文书
作文评语集锦大全
2014/04/23 职场文书
献爱心捐款倡议书
2014/05/14 职场文书
公司承诺书怎么写
2014/05/24 职场文书
科学育儿宣传标语
2014/10/08 职场文书
给客户的检讨书
2014/12/21 职场文书
优质护理服务心得体会
2016/01/22 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS