以脚本形式执行模块
当使用以下方式执行 Python 模块时:
python fibo.py <arguments>
模块中的代码将被执行,就像导入了该模块,但是 __name__ 设置成为 "__main__"。这如同在模块末尾添加以下代码:
if __name__ == "__main__":import sysfib(int(sys.argv[1]))
可以将该文件作为脚本和可导入模块使用,因为只有当模块作为“主”文件执行时,解析命令行的代码才会运行:
python fibo.py 50
如果导入模块,则代码不会运行:
import fibo
这通常用于为模块提供方便的用户接口,或用于测试目的。
模块搜索路径
导入名为 spam 的模块时,解释器首先搜索具有该名称的内置模块。如果未找到,它将在变量 sys.path 给出的目录列表中搜索名为 spam.py 的文件。sys.path 从以下位置初始化:
● 包含输入脚本的目录(或未指定文件时的当前目录)。
● PYTHONPATH(目录名列表,语法与 shell 变量 PATH 相同)。
● 依赖于安装的默认设置(按照惯例,包括由 site 模块处理的 site-packages 目录)。
初始化后,Python 程序可以修改 sys.path。包含正在运行的脚本的目录位于搜索路径的开头,位于标准库路径的前面。这意味着将加载该目录中的脚本,而不是库目录中同名的模块。除非特意如此设计,否则这样做是一个错误。
“编译的” Python 文件
为了加快加载模块的速度,Python 将每个模块的编译版本缓存在 __pycache__ 目录下,名为 module.version.pyc。其中版本对编译文件的格式进行编码;它通常包含 Python 版本号。例如,在 CPython 3.3 版中,spam.py 的编译版本将被缓存为 __pycache__/spam.cpython-33.pyc。这种命名约定允许来自不同版本Python的编译模块共存。
Python 根据编译后的版本检查源代码的修改日期,看它是否过期,是否需要重新编译。这是一个完全自动的过程。此外,编译的模块与平台无关,因此可以在具有不同体系结构的系统之间共享同一个库。
Python 在两种情况下不检查缓存。首先,它总是重新编译并且不存储直接从命令行加载的模块的结果。其次,如果没有源模块,它不会检查缓存。要支持非源(仅编译)发行版,编译的模块必须位于源目录中,并且不能有源模块。
专家提示:
● 可以在 Python 命令上使用 -O 或 -OO 开关来减小已编译模块的大小。-O 开关删除断言语句,-OO 开关同时删除断言语句和 __doc__ 字符串。由于某些程序可能依赖于这些,因此只有在知道自己在做什么的情况下,才应该使用此选项。“优化的”模块有一个 opt- 标记,通常会更小。未来的版本可能会改变优化的效果。
● 程序从 .pyc 文件读取不会运行得比从 .py 文件更快;唯一快一点的是从 .pyc 文件加载它们的速度。
● 模块 compileall 可以为一个目录中的所有模块创建 pyc 文件。
官方文档:
https://docs.python.org/3.9/tutorial/modules.html




