这里有新鲜出炉的 Python 入门,程序狗速度看过来!
Python 编程语言
Python 是一种面向对象,解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年.Python 语法简洁而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起.
这篇文章主要介绍了快速了解 Python 相对导入,具有一定借鉴价值, 需要的朋友可以参考下
1,绝对导入和相对导入
绝对导入:按照 sys.path 顺序搜索,先主目录(sys.path 中第一项''),然后 PYTHONPATH 环境变量,标准库路径,pth 指定路径等.
相对导入:在模块所在同一个包内搜索,注意该包目录与主目录的区别.
例 1:有以下目录
mod.py 内容:import string
app/
__init__.py
mod.py
string.py
当在 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:
尝试在 mod1.py 导入 mod2.py,加入 from ..sub2 import mod2.
app/
__init__.py
sub1/
__init__.py
mod1.py
sub2/
__init__.py
mod2.py
直接在 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:
start.py 中包含 import sub.relative,relative.py 中包含 from .. import parent.
__init__.py
start.py
parent.py
sub/
__init__.py
relative.py
执行 python start.py 将报错:"Attempted relative import beyond toplevel package".
解决办法:新建 pkg 目录,将 parent.py,sub 目录移到 pkg 目录中,start.py 改为 import pkg.sub.relative,其它不变.
总结
以上就是本文关于快速了解 Python 相对导入的全部内容,希望对大家有所帮助.感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出.感谢朋友们对本站的支持!
来源: http://www.phperz.com/article/18/0127/362729.html