模块
模块可以包含可执行语句和函数定义。这些语句用于初始化模块。它们仅在import语句中第一次遇到模块名时执行。
每个模块都有自己的私有符号表,该表被模块中定义的所有函数用作全局符号表。因此,模块的作者可以在模块中使用全局变量,而不用担心与用户的全局变量发生意外冲突。
模块可以导入其他模块。通常,但不要求将所有import语句放在模块(或脚本)的开头。导入的模块名称放置在导入模块的全局符号表中。例如:import fibo;import语句的一个变体是将名称从模块直接导入导入模块的符号表中,例如:from fibo import fib,fib2;甚至还有一个变体可以导入模块定义的所有名称:from fibo import *,这将导入除以下划线(_)开头的名称以外的所有名称。在大多数情况下,Python程序员不使用这个工具,因为它在解释器中引入了一组未知的名称,可能隐藏了一些您已经定义的内容;导入模块时,如果模块名后跟as,那么as后面的名称将直接绑定到导入的模块,例如:import fibo as fib,那么fibo模块内部的名称可以通过fib来访问,fibo这个名字则不可以用了,对于from形式的导入用as具有同样的效果,例如:from fibo import fib as fibonacci,那么用名称fibonacci来访问fibo模块中的fib名称。
为了提高效率,每个模块在每个解释器会话中只导入一次。因此,如果您更改了模块,则必须重新启动解释器,或者,如果只是一个要交互测试的模块,则使用importlib.reload(),例如import importlib;importlib.reload(modulename)。
1.模块搜索路径
导入名为spam的模块时,解释器首先搜索具有该名称的内置模块。如果找不到,则在sys.path变量给定的目录列表中搜索名为spam.py的模块。
模块site在初始化期间自动导入sys.path。可以使用解释器的-s选项抑制自动导入。

2.编译模块
为了加快加载模块的速度,Python将每个模块的编译版本缓存为__pycache__目录下的名称为module.version.pyc的文件,其中版本对编译文件的格式进行编码;它通常包含Python版本号。这种命名约定允许来自不同版本Python的编译模块共存。
Python根据编译版本检查源代码的修改日期,看它是否过期,是否需要重新编译。这是一个完全自动化的过程。此外,编译后的模块与平台无关,因此可以在具有不同体系结构的系统之间共享同一个库。
Python在两种情况下不检查缓存。首先,它总是重新编译并且不存储直接从命令行加载的模块的结果。其次,如果没有源模块,它不会检查缓存。要支持非源(仅编译)发行版,编译的模块必须位于源目录中,并且不能有源模块。
3.标准模块