当前位置: 首页 > 编程笔记 >

快速了解Python相对导入

涂浩皛
2023-03-14
本文向大家介绍快速了解Python相对导入,包括了快速了解Python相对导入的使用技巧和注意事项,需要的朋友参考一下

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相对导入的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

 类似资料:
  • 本文向大家介绍快速了解Maven,包括了快速了解Maven的使用技巧和注意事项,需要的朋友参考一下 也许是本人不才,初识Maven时,被各种不明所以的教程搞得一头雾水,而在后来的使用中,我发现Maven大部分功能没有想象的那么困难。 本片文章面向Maven初学者,希望能让其以最快的速度了解Maven并享受到它所带来的一系列好处。 [一个简单的问题] 在进行讲解前,先提问一个简单的问题。 假如你正在

  • 本文向大家介绍快速了解Python开发环境Spyder,包括了快速了解Python开发环境Spyder的使用技巧和注意事项,需要的朋友参考一下 Spyder简介 Spyder (前身是 Pydee) 是一个强大的交互式 Python 语言开发环境,提供高级的代码编辑、交互测试、调试等特性,支持包括 Windows、Linux 和 OS X 系统。 ● 菜单栏(Menu bar):显示可用于操纵Sp

  • 我很难理解quicksort,大多数演示和解释都忽略了实际发生的事情(例如http://me.dt.in.th/page/quicksort/)。 维基百科说: 从数组中选择一个称为透视的元素。分区:对数组重新排序,使所有值小于pivot的元素都在pivot之前,而所有值大于pivot的元素都在pivot之后(相等的值可以从任何一个方向走)。分区后,枢轴处于其最终位置。这称为分区操作。将上述步骤递

  • 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架(不

  • 营销通是纷享销客为企业市场营销管理提供从获客到成交的营销一体化方案。 纷享营销一体化核心业务流程: 纷享营销一体化方案价值: 1. 渠道投放效果跟踪 接入企业现有的营销获取渠道,通过统一线索管理视图、线索工作台,识别线索来源, 评估渠道线索产出,帮助企业优化渠道配置,提高现有渠道的获客效率。 2. 精细化线索管理 识别线索来源、重复线索处理、质量评估、分配流转可视化数字化管理,帮助市场部跟踪从各个

  • 本文向大家介绍快速了解Hibernate中的Session,包括了快速了解Hibernate中的Session的使用技巧和注意事项,需要的朋友参考一下 Hibernate中的Session是一级缓存,可以理解为进程级(是线程吧)的缓存,在进程(是线程吧)运行期间一直存在。 session可以理解为一个可以操作数据库的对象,该对象中有操作数据库的方法。 在Java里面,缓存通常是指Java对象的属性