快速了解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中每次处理一个字符的5种方法
May 21 Python
python图书管理系统
Apr 05 Python
python使用turtle库绘制时钟
Mar 25 Python
Python重新加载模块的实现方法
Oct 16 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
Dec 05 Python
python装饰器常见使用方法分析
Jun 26 Python
python的常见矩阵运算(小结)
Aug 07 Python
python字符串替换re.sub()方法解析
Sep 18 Python
Python多线程及其基本使用方法实例分析
Oct 29 Python
python多线程使用方法实例详解
Dec 30 Python
Python如何输出百分比
Jul 31 Python
聊聊Python String型列表求最值的问题
Jan 18 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多层数组与对象的转换实例代码
2013/08/05 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
2015/12/07 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
js电信网通双线自动选择技巧
2008/11/18 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
[02:22:36]《加油!DOTA》总决赛
2014/09/19 DOTA
跟老齐学Python之Python文档
2014/10/10 Python
全面解析Python的While循环语句的使用方法
2015/10/13 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
深入理解Python中的super()方法
2017/11/20 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
简单实现Python爬取网络图片
2018/04/01 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
白宫黑市官网:White House Black Market
2016/11/17 全球购物
微软日本官方网站:Microsoft日本
2017/11/26 全球购物
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
英语系毕业生自荐信
2013/10/31 职场文书
缓刑人员的思想汇报
2014/01/11 职场文书
学生实习证明范文
2014/09/28 职场文书
盗窃案辩护词
2015/05/21 职场文书
刑事上诉状范文
2015/05/22 职场文书
ORACLE查看当前账号的相关信息
2021/06/18 Oracle