python__package__module_0">python 中的 package 和 module
python 名词表
教程
- package: 一个包含多个 module 的目录,可以包含子目录,是一种特殊的 module。
A Pythonmodule
which can contain submodules or recursively, subpackages. Technically, a package is a Python module with a__path__
attribute. - module:
一个包含 python 代码的.py文件
。import 语句将操作系统级别的文件导入到 python 级别(概念)的模块。
An object that serves as an organizational unit of Python code. Modules have a namespace containing arbitrary Python objects. Modules are loaded into Python by the process of importing.
import 内部机制(absolute import)
导入模块
python">import testimport test as t # 给 module 取别名,这样只有t变量是被定义的import test.classA # 导入 test 包中的 classA, 导入模块,刷新缓存,但是只把classA类赋值给变量
- python 解释器会拿到 test 字符串作为名字来寻找 module
- 首先会检查缓存有没有名为 test 的 module,如果有,则直接使用缓存中的 module
- 如果没有,则会先看 test 是不是一个
build-in module
,如果是,则直接导入,并将其加入缓存 - 如果不是,则会在
sys.path
中寻找能被 load 成 test 的文件(一般为 test.py 文件),如果找到,则将其作为 package 导入 - 在一个单独的 namespace 中执行 module 中的代码,并将 module 中的对象添加到当前的 namespace 中,并将其加入缓存
- 将导入好的 module 赋值给 test 变量,并返回 test 变量,这样 test 可以作为一个变量来使用
名词解析
- sys.path: 一个列表,包含了 python 解释器会(从前往后)搜索 module 的路径。如果是使用
python example.py
的形式运行脚本,则 sys.path 第一个元素为脚本所在目录,同时在 python 运行过程中,会把 python 自带的 package 路径也加入到 sys.path 中(包括site-packages
目录即 pip install 安装的包) - namespace: 一个字典,包含了当前模块中定义的变量、函数、类等。
导入包
python">import mypackageimport mypackage.subpackage.moduleA
- package 就是一个特殊的 module, 所以导入包的过程和导入模块的过程是十分相似的
- 导入模块的时候,是把模块里的代码在一个单独的命名空间中执行,然后构成 module 对象,并将其加入缓存
- 导入包的时候,python 解释器会查看包的
__init__.py
文件,然后执行里面的代码,如果没有不会执行任何额外的代码,所以想要引用包中的模块,需要使用包名.模块名
的形式来导入 - import package 的时候,会在一个单独的命名空间运行
__init__.py
文件,用这个命名空间来构建 package 对象,并将其加入缓存
relative import
- 相对导入: 导入模块或者包时,可以使用相对路径来导入,相对路径是相对于当前模块或者包的路径的
- 相对导入的语法是
from . import moduleA
,表示从当前模块的同级目录下导入 moduleA - 相对导入的语法是
from .. import moduleA
,表示从当前模块的上级目录下导入 moduleA - 相对导入的语法是
from .subpackage import moduleA
,表示从当前包的子包中导入 moduleA - 相对导入的语法是
from ..subpackage import moduleA
,表示从当前包的上级包中导入 moduleA
相对导入只能在 package 里面的 module 中使用,相对导入其实就是根据 package 变量来转换成绝对路径,然后再导入模块或者包.