快速了解Python相对导入
Python  /  管理员 发布于 7年前   148
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__.pystart.pyparent.pysub/ __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相对导入的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号