– 定位和执行Python模块 – 导入模块(Python教程)(参考资料)
runpy
– 找到并执行Python模块
源代码: Lib / runpy.py
runpy
module用于定位和运行Python模块,首先使用它们。它的主要用途是实现-m
命令行开关,允许使用Python模块命名空间而不是文件系统定位脚本.
注意这是not沙盒模块 – 所有代码都在当前进程中执行,任何副作用(如其他模块的缓存导入)将在函数返回后保留在原位.
此外,执行代码定义的任何函数和类都不能保证在runpy
函数返回后正常工作。如果对于给定的用例不能接受该限制,importlib
可能是比这个模块更合适的选择.
runpy
模块提供两个功能:
runpy.
run_module
(mod_name, init_globals=None, run_name=None, alter_sys=False)-
执行指定模块的代码并返回生成的moduleglobals字典。模块的代码首先使用标准导入机制定位(参考 PEP 302 详情)然后重新执行模块命名空间
// mod_name参数应该是一个绝对的模块名。如果模块名称是指一个包而不是一个普通模块,那么该包被导入并且
__main__
子模块然后执行包然后生成的模块全局字典recreturned.可选的字典参数init_globals可以用来在执行代码之前预先填充模块的全局字典。提供的字典不会被修改。如果在提供的字典中定义了任何特殊的全局变量,则这些定义会被
run_module()
.特殊的全局变量
__name__
,__spec__
,__file__
,__cached__
,__loader__
和__package__
在执行模块代码之前在globalsdictionary中设置(请注意,这是最小的变量集 – 其他变量可以隐式设置为解释器实现细节).__name__
设置为run_name如果这样可选参数不是None
,对于mod_name + ".__main__"
如果命名模块是apackage而且mod_name参数否则.__spec__
将被正确设置为actually importmodule(即__spec__.name
总是mod_name或mod_name + ".__main__
,永远不会run_name)。__file__
,__cached__
,__loader__
和__package__
是设置为正常基于模块规格如果参数alter_sys提供并评估为
True
,然后使用sys.argv[0]
的值更新__file__
并使用临时模块对象更新sys.modules[__name__]
以便正在执行的模块。在函数返回之前sys.argv[0]
和sys.modules[__name__]
都恢复到原始值.注意这个
sys
不是线程安全的。其他线程可能会看到部分初始化的模块,以及更改的参数列表。建议sys
当从线程代码中调用此函数时,模块会被单独放置.也可以看看
-m
选项提供命令行中的等效功能.在版本3.1中更改:通过查找
__main__
submodule.版本3.4更改:更新以利用 PEP 451 添加的模块规格功能。这允许
__cached__
以这种方式正确设置modulesrun,以及确保真正的模块名称始终可以作为__spec__.name
.
runpy.
run_path
(file_path, init_globals=None, run_name=None)-
在指定的文件系统位置执行代码并返回结果模块全局字典。与提供给CPythoncommand行的脚本名称一样,提供的路径可以引用Python源文件,编译的字节码文件或包含
__main__
模块的有效sys.path条目(例如包含顶级的zipfile)__main__.py
文件.对于一个简单的脚本,指定的代码只是在一个freshmodule命名空间中执行。对于有效的sys.path条目(通常是zipfile或目录),该条目首先添加到
sys.path
的开头。然后,该函数使用更新路径查找并执行__main__
模块。请注意,如果在指定位置没有这样的模块,则没有特别保护来调用位于__main__
其他地方的现有sys.path
条目.可选字典参数init_globals可以用来在执行代码之前预先填充模块的全局字典。提供的字典不会被修改。如果在提供的字典中定义了任何特殊的全局变量,那么这些定义会被
run_path()
.覆盖特殊的全局变量
__name__
,__spec__
,__file__
,__cached__
,__loader__
和__package__
在模块代码之前的globalsdictionary中设置执行(请注意,这是最小的变量集 – 其他变量可以隐式设置为解释器实现细节).__name__
设置为run_name如果此可选参数不是None
和"<run_path>"
否则//如果提供的路径直接引用脚本文件(无论是作为预编译的字节代码的源代码),那么
__file__
将被设置为提供的路径,和__spec__
,__cached__
,__loader__
和__package__
将全部设置为None
.如果提供的路径是对有效sys.path条目的引用,则
__spec__
将被设置适合进口的__main__
模块(即__spec__.name
总是__main__
)。__file__
,__cached__
,__loader__
和__package__
将正常设置基于模块规格对
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条目导入,直接执行.
参见
- PEP 338 – 执行模块作为脚本
- PEP编写和由Nick Coghlan执行.
- PEP 366 – 主模块显式相对导入
- PEP由Nick Coghlan编写和实现.
- PEP 451 – 导入系统的ModuleSpec类型
- 由Eric Snow编写和实现的PEP
命令行和环境 – CPython命令行详细信息
importlib.import_module()
功能