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_name 或mod_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_path
和sys.modules[__name__]
用正在执行的模块的临时模块对象更新。对中项目的所有修改sys
在函数返回之前还原。注意,不同于
run_module()
,对sys
在该函数中不是可选的,因为这些调整对于允许执行sys.path条目至关重要。由于线程安全限制仍然适用,因此在线程代码中使用此函数应使用导入锁进行串行化或委托给单独的进程。参见
接口选项 用于命令行上的等效功能 (
python path/to/script
)3.2 新版功能.
在 3.4 版更改: 更新以利用模块规范功能 PEP 451 . 这允许
__cached__
在以下情况下正确设置__main__
从有效的sys.path条目导入,而不是直接执行。