快速了解Python相对导入

作者:mingz2013 时间:2023-07-29 18:35:30 

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,其它不变。

来源:http://blog.csdn.net/mingzznet/article/details/53326194

标签:python,相对导入
0
投稿

猜你喜欢

  • Django auth 应用模块详解

    2023-05-20 11:17:17
  • python 删除字符串中连续多个空格并保留一个的方法

    2021-08-16 14:07:25
  • Mysql彻底解决中文乱码问题的方案(Illegal mix of collations for operation)

    2024-01-26 16:33:51
  • asp.net aspnetpager分页统计时与实际不符的解决办法

    2023-06-30 04:02:32
  • Python使用pycharm导入pymysql教程

    2024-01-17 22:47:49
  • 详解golang中的闭包与defer

    2024-04-26 17:32:58
  • Python集合set的交集和并集操作方法

    2023-12-25 17:35:56
  • Python3 json模块之编码解码方法讲解

    2021-07-15 17:29:15
  • Scrapy-redis爬虫分布式爬取的分析和实现

    2023-01-04 10:21:19
  • 大家都说好用的Python命令行库click的使用

    2023-05-17 04:00:15
  • 怎样在不同版本SQL Server中存储数据

    2009-01-20 13:11:00
  • Go语言使用sort包对任意类型元素的集合进行排序的方法

    2023-09-02 03:55:18
  • ORACLE常见错误代码的分析与解决(三)

    2024-01-17 19:17:57
  • 12种最常用的网页编程语言简介(值得收藏)

    2023-01-29 17:40:48
  • 比较详细的Asp伪静态化方法及Asp静态化探讨

    2011-04-14 10:41:00
  • PHP使用星号替代用户名手机和邮箱的实现代码

    2023-11-17 05:50:02
  • 浅谈Python3中print函数的换行

    2023-12-15 18:24:31
  • Python文件名的匹配之clob库

    2022-11-17 06:59:46
  • Pytorch 图像变换函数集合小结

    2022-06-14 08:52:09
  • Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)

    2021-08-31 22:57:06
  • asp之家 网络编程 m.aspxhome.com