Python 模块/包的导入以及 import 的用法总结

Python 模块/包的导入以及 import 的用法总结

一、模块/包

1. 前言

  • 一个以 .py 为后缀的 Python 文件就是一个模块。
  • 包是一个文件夹或一个目录。
  • 每个包都有一个全局定义的配置文件 __init__.py 存在,否则导入包时无法找到里面的模块。
  • 一个包可以包含多个模块。

  一个模块可以包含类、方法、变量等。导入模块时查找模块的顺序:

  • 先从内存中已经导入的模块中查找。
  • 内置的模块。内置模块有 os、sys、time、UUID 等。
  • 环境变量 sys.path 中查找。

2. 包

  Python 的包不一定需要 __init__.py 文件。有 __init__.py 文件存在的称为普通包,没有 __init__.py 存在的称为命名空间包。

3. __init__.py 文件详解

  __init__.py 作用:标识该目录是一个 Python 的模块包;简化模块导入操作。
  实际上,如果目录中包含了 __init__.py 时,当用 import 导入该目录时,会执行 __init__.py 里面的代码。这样我们可以在 __init__.py 文件中批量导入我们所需要的模块,而不再需要一个一个的导入。__init__.py 中还有一个重要的变量,__all__, 它关联了一个模块列表,用来限制模块导入,只有指定的属性、方法、类可以被导入。当执行 from 包 import * 时,就会导入其中 __init__.py 中 __all__ 列表中的模块。若没有定义 __all__ 属性,则导入模块中所有的公有属性、方法、类。
  有 __init__.py 文件的包可以看作是一个模块。

二、import 用法

1.当前工作目录和模块搜索路径

  当前工作目录(Current Working Directory,cwd),又叫资源搜索目录,Python 中用相对路径 “.” 表示当前目录。程序当前工作目录为启动程序时所在的目录,改变启动程序时的目录,“.” 代表的目录也会变,因此使用时要当心。
  当前工作目录查看方法:

import os
print(os.getcwd())
# 或者
print(os.path.abspath('.'))

  模块搜索路径,指通过 import 导入模块的路径。模块第一搜索路径为所执行的 Python 文件所在的目录,而不是当前工作目录。因此,模块第一搜索路径不随当前工作目录改变而改变。
  使用以下命令查看模块搜索路径:

import sys
sys.path    # 是一个列表,列出模块搜索路径

  sys.path 包含以下内容,且搜索模块时按照以下顺序搜索:

  • 当前 .py 文件所在的那一级目录。
  • 环境变量 PYTHONPATH 指定的目录列表。
  • 安装 Python 时配置的相关目录列表。
  • 自己添加的路径。

2. 直接引入

  在引入模块时,会执行一次模块的内容。

# import 方法导入时创建一个命名空间,通过这个命名空间访问模块中的方法、类、变量
import 模块[ as 模块的别名]
import 包    # 实际上导入的是包的 __init__.py 文件,包命名空间包不能直接导入
import 模块1,模块2    # 不推荐

3. from方法引入

  以下内容中包可以是普通包,也可以是命名空间包:

# from 语句不创建命名空间,而是将模块中的对象直接导入到当前的命名空间
# from 模块/包 import 模块/函数
from 模块 import 变量、方法、类
from 模块 import *    # 从模块中导入所有工具,函数容易和别的模块中的函数重名
from 包 import 模块
from 包.模块 import 变量、方法、类

三、相对路径导入

  通过绝对路径引用模块,存在后续改变代码结构或者文件改名时修改工作多的问题。相对路径引用模块不存在这个问题。
  有相对路径导入的 .py 文件不可以直接运行,即相对导入只能存在于模块中
  相对路径导入采用以下方法:

# 此处 “.” 在程序运行时表示模块所在的目录,“..” 表示模块所在目录的父目录,“...” 表示模块父目录的父目录
from .模块/包 import 模块、变量、方法、类
from . import 模块    # 同层目录的模块
from .包 import 模块    # 模块位于同层包内部,且不存在子包
from .包.子包 import 模块    # 模块位于同层包内部,且存在子包
# 若模块位于父目录中,则把 “.” 换成 “..”,以此类推!
# 使用相对路径表示的目录不能是项目顶级目录,否则会报错:attempted relative import beyond top-level package
# 因此,一般相对导入只是在同一包下而言的
# 若要导入其它包的模块,则使用 sys.path 添加对应目录
# 解决办法:sys.path 中加入顶级目录,然后从高向低引用

  然而,其它文件引用本 .py 文件时,有报错风险!因此,能用绝对路径导入就不要用相对路径导入。当文件夹结构固定,文件只在一个包中互相引用时,推荐使用相对引用

参考资料

  1.https://www.ycpai.cn/python/abGB99Xq.html
  2.https://blog.csdn.net/m0_70813473/article/details/127402951
  3.https://www.cnblogs.com/devilmaycry812839668/p/16417409.html
  4.https://blog.csdn.net/yongqiangyue/article/details/7707854
  5.https://blog.csdn.net/qq_57289939/article/details/127811800
  6.https://blog.csdn.net/qdPython/article/details/129144607
  7.https://blog.csdn.net/weixin_43958105/article/details/114012590
  8.https://wiki.woodpecker.org.cn/moin/PythonEssentialRef8#CA-25bbc0bf9b0da0e01e8ee708a5ecb11c51c69e13_1
  9.https://blog.csdn.net/zhouguoqionghai/article/details/99697848

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值