当一个名为 spam 的模块被导入的时候,解释器首先寻找具备该名称的内置模块。若是没有找到,而后解释器从 sys.path 变量给出的目录列表里寻找名为 spam.py 的文件。sys.path 初始有这些目录地址:html
包含输入脚本的目录(或者未指定文件时的当前目录)。
PYTHONPATH (一个包含目录名称的列表,它和shell变量 PATH 有同样的语法)。
取决于安装的默认设置
注解 在支持符号连接的文件系统上,包含输入脚本的目录是在追加符号连接后才计算出来的。换句话说,包含符号连接的目录并 没有 被添加到模块的搜索路径上。
在初始化后,Python程序能够更改 sys.path。包含正在运行脚本的文件目录被放在搜索路径的开头处, 在标准库路径以前。这意味着将加载此目录里的脚本,而不是标准库中的同名模块。 除非有意更换,不然这是错误。更多信息请参阅 python标准模块。python
“编译过的”Python文件shell
为了加速模块载入,Python在 pycache 目录里缓存了每一个模块的编译后版本,名称为 module.version.pyc ,其中名称中的版本字段对编译文件的格式进行编码; 它通常使用Python版本号。例如,在CPython版本3.3中,spam.py的编译版本将被缓存为 __pycache__/spam.cpython-33.pyc。此命名约定容许来自不一样发行版和不一样版本的Python的已编译模块共存。缓存
Python根据编译版本检查源的修改日期,以查看它是否已过时并须要从新编译。这是一个彻底自动化的过程。此外,编译的模块与平台无关,所以能够在具备不一样体系结构的系统之间共享相同的库。优化
Python在两种状况下不会检查缓存。首先,对于从命令行直接载入的模块,它历来都是从新编译而且不存储编译结果;其次,若是没有源模块,它不会检查缓存。为了支持无源文件(仅编译)发行版本, 编译模块必须是在源目录下,而且绝对不能有源模块。编码
给专业人士的一些小建议:spa
你能够在Python命令中使用 -O 或者 -OO 开关, 以减少编译后模块的大小。 -O 开关去除断言语句,-OO 开关同时去除断言语句和 doc 字符串。因为有些程序可能依赖于这些,你应当只在清楚本身在作什么时才使用这个选项。“优化过的”模块有一个 opt- 标签而且一般小些。未来的发行版本或许会更改优化的效果。
一个从 .pyc 文件读出的程序并不会比它从 .py 读出时运行的更快,.pyc 文件惟一快的地方在于载入速度。
compileall 模块能够为一个目录下的全部模块建立.pyc文件。
关于这个过程,PEP 3147 中有更多细节,包括一个决策流程图。命令行