Python 相对导入
来源:互联网 发布:淘宝运营团队服务费 编辑:程序博客网 时间:2024/05/19 23:29
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__.pysub1/
__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 相对导入
- 6.python 相对导入
- Python 相对导入
- python 相对导入
- Python 相对导入
- Python相对导入问题
- Python-相对导入、绝对导入
- Python相对、绝对导入浅析
- python的package import 以及相对导入和绝对导入
- python import 搜索路径及相对导入和绝对导入
- 详解Python中的相对导入和绝对导入
- Python导入模块的几种姿势(常规导入, 相对导入, 可选导入, 本地导入)
- Python相对导入导致SystemError的解决方案(译)
- python基础-同级包模块导入、__init__、syspath导入存在的问题、绝对相对导入、单独包导入
- 关于python模块循环导入(circular imports)/相对导入(Relative Imports)/绝对导入(Absolute Imports)的官方资料
- 解决python相对导入出现错误:Attempted relative import beyond toplevel package
- python相对导入/绝对导入以及__init__.py中的__all__和__path__变量以及sys.path搜索路径
- the symbol x is undefined
- 多表查询结果,分页
- Java反射机制的学习
- Linux下对MYSQL数据库的操作
- django入门笔记13 - 国际化
- Python 相对导入
- Service 与 Thread 的区别
- LRJ白书图论 11324 - The Largest Clique uva
- hdu 1033 (简单)
- 算法查找学习笔记
- eclipse中Android模拟器,DDMS看不到设备的解决及有时无打印Log,自己有小改
- C语言文件操作与例子
- 淘宝模板开发系之XML配置白名单
- django入门笔记14 - 安全