python的import原理和方式总结
python中import的几种方式:
1. import math
import os, math, sys
2. import math as pymath
3. from math import exp
4. from math import *
在理解import原理之前,需要明白python的库,模块,包:
库library:一种特定功能集合的通俗说法
包含一些程序功能,通过import 引入使用对应模块和包,python也具有一些标准库,还有第三方库
模块module:以单个文件为命名空间的代码片段
模块是一个单独的.py文件,模块名就是文件名,一般模块有这段代码,区分是被导入对象还是主程序:if __name__ == "__name__"
包package:由一组模块构成,有层次命名空间的程序功能
包由多个.py文件有组织的构成,包是模块的上一级概念
接着来理解python如何将库,包,模块import进来的:
Python 执行以下语句会发生什么:
1 |
import mod |
当解释器执行上面的import
语句时,它将在从以下来源收集的目录列表中搜索mod.py
:
- 输入脚本的运行目录,如果解释器正在交互运行,则为当前目录。
- PYTHONPATH环境变量(如果已设置)中包含的目录列表。 (“PYTHONPATH”的格式取决于操作系统,但与”PATH”环境变量相似。)
- 在安装 Python 时配置的与安装有关的目录列表。
在 Python 变量 sys.path 中可以访问生成的搜索路径,该变量是从名为 sys 的模块获得的:
1 2 3 4 5 6 |
>>> import sys >>> sys.path ['', '/home/roark/personal', '/home/roark/workdir', '/usr/local/Python/3.7/lib', '/usr/local/python3.7/site-packages', '/usr/local/Python/3.7/python37.zip', '/usr/local/Python/3.7/lib/python3.7'] |
因此,为了确保找到我们的模块,我们需要执行以下操作之一:
- 将
mod.py
放置在输入脚本所在的目录或当前工作目录中(如果是交互式的话) - 在启动解释器之前修改”PYTHONPATH”环境变量以包含”mod.py”所在的目录(或将”mod.py”放入”PYTHONPATH”变量已包含的目录之一)
实际上还有一个附加选项:我们可以将模块文件放在您选择的任何目录中,然后在运行时修改 sys.path 使其包含该目录。例如,在这种情况下,我们可以将”mod.py”放在目录”/home/sarah/”中,然后发出以下语句:
1 2 3 4 5 6 7 8 |
>>> sys.path.append(r'/home/sarah/') >>> sys.path ['', '/home/roark/personal', '/home/roark/workdir', '/home/sarah', '/usr/local/Python/3.7/lib', '/usr/local/python3.7/site-packages', '/usr/local/Python/3.7/python37.zip', '/usr/local/Python/3.7/lib/python3.7'] >>> import mod |
导入模块后,我们可以使用模块的file属性来确定找到该模块的位置:
1 2 3 4 5 6 7 |
>>> import mod >>> mod.__file__ '/home/sarah/mod.py' >>> import datetime >>> datetime.__file__ '/usr/local/Python/3.7/lib/datetime.py' |
file的目录部分应该是 sys.path 中的目录之一。