runpy ---定位并执行python模块

源代码: Lib/runpy.py


这个 runpy 模块用于定位和运行python模块,而不首先导入它们。它的主要用途是实现 -m 命令行开关,允许使用python模块名称空间而不是文件系统定位脚本。

注意这是 not 沙盒模块-所有代码都在当前进程中执行,任何副作用(如缓存导入其他模块)都将在函数返回后保持原位。

此外,执行代码定义的任何函数和类在 runpy 函数已返回。如果该限制对于给定的用例是不可接受的, importlib 可能是比本模块更合适的选择。

这个 runpy 模块提供两个功能:

runpy.run_module(mod_name, init_globals=None, run_name=None, alter_sys=False)

执行指定模块的代码并返回生成的模块全局字典。模块的代码首先使用标准导入机制定位(请参阅 PEP 302 有关详细信息),然后在新的模块命名空间中执行。

这个 mod_name 参数应为绝对模块名。如果模块名引用的是一个包而不是一个普通的模块,那么该包将被导入,并且 __main__ 然后执行该包中的子模块,并返回生成的模块全局字典。

可选字典参数 init_globals 可用于在执行代码之前预填充模块的全局字典。将不修改提供的词典。如果在提供的字典中定义了以下任何特殊全局变量,则这些定义将被重写 run_module() .

特殊全局变量 __name____spec____file____cached____loader____package__ 在执行模块代码之前在全局字典中设置(注意这是一组最小的变量-其他变量可以隐式设置为解释器实现细节)。

__name__ 设置为 run_name 如果此可选参数不是 None ,至 mod_name + '.__main__' 如果命名模块是一个包,则指向 mod_name 否则就自相矛盾。

__spec__ 将为 事实上 导入模块(即, __spec__.name 将永远 mod_namemod_name + '.__main__ 永不 run_name

__file____cached____loader____package__set as normal 根据模块规格

如果参数 alter_sys 提供并评估为 True 然后 sys.argv[0] 更新值为 __file__sys.modules[__name__] 用正在执行的模块的临时模块对象更新。两个 sys.argv[0]sys.modules[__name__] 在函数返回之前还原为其原始值。

注意,这种操纵 sys 不是线程安全的。其他线程可能会看到部分初始化的模块以及修改后的参数列表。建议 sys 当从线程代码调用此函数时,不要使用模块。

参见

这个 -m 选项提供来自命令行的等效功能。

在 3.1 版更改: 通过查找 __main__ 子模块。

在 3.2 版更改: 补充 __cached__ 全局变量(请参见 PEP 3147

在 3.4 版更改: 更新以利用模块规范功能 PEP 451 . 这允许 __cached__ 要正确设置以这种方式运行的模块,并确保始终可以访问真正的模块名称,因为 __spec__.name .

runpy.run_path(file_path, init_globals=None, run_name=None)

在指定的文件系统位置执行代码,并返回生成的模块全局字典。与提供给cpython命令行的脚本名一样,提供的路径可能引用python源文件、编译的字节码文件或包含 __main__ 模块(例如,包含顶层的压缩文件 __main__.py 文件)。

对于一个简单的脚本,指定的代码只是在一个新的模块名称空间中执行。对于有效的sys.path条目(通常是zipfile或目录),该条目首先添加到 sys.path . 然后函数查找并执行 __main__ 模块使用更新的路径。注意,对于调用现有的 __main__ 入口位于 sys.path 如果在指定位置没有这样的模块。

可选字典参数 init_globals 可用于在执行代码之前预填充模块的全局字典。将不修改提供的词典。如果在提供的字典中定义了以下任何特殊全局变量,则这些定义将被重写 run_path() .

特殊全局变量 __name____spec____file____cached____loader____package__ 在执行模块代码之前在全局字典中设置(注意这是一组最小的变量-其他变量可以隐式设置为解释器实现细节)。

__name__ 设置为 run_name 如果此可选参数不是 None 并且 '<run_path>' 否则。

如果提供的路径直接引用脚本文件(无论是作为源代码还是作为预编译的字节代码),则 __file__ 将设置为提供的路径,并且 __spec____cached____loader____package__ 将全部设置为 None .

如果提供的路径是对有效sys.path条目的引用,则 __spec__ 将为导入的 __main__ 模块(即 __spec__.name 将永远 __main____file____cached____loader____package__set as normal 根据模块规格

还对 sys 模块。首先, sys.path 可按上述要求进行更改。 sys.argv[0] 更新值为 file_pathsys.modules[__name__] 用正在执行的模块的临时模块对象更新。对中项目的所有修改 sys 在函数返回之前还原。

注意,不同于 run_module() ,对 sys 在该函数中不是可选的,因为这些调整对于允许执行sys.path条目至关重要。由于线程安全限制仍然适用,因此在线程代码中使用此函数应使用导入锁进行串行化或委托给单独的进程。

参见

接口选项 用于命令行上的等效功能 (python path/to/script

3.2 新版功能.

在 3.4 版更改: 更新以利用模块规范功能 PEP 451 . 这允许 __cached__ 在以下情况下正确设置 __main__ 从有效的sys.path条目导入,而不是直接执行。

参见

PEP 338 --以脚本形式执行模块

PEP由Nick Coghlan编写并实施。

PEP 366 --主模块显式相对导入

PEP由Nick Coghlan编写并实施。

PEP 451 --导入系统的modulespec类型

由Eric Snow编写和实现

命令行和环境 -cpython命令行详细信息

这个 importlib.import_module() 功能