On this page
31.7. runpy —查找和执行 Python 模块
2.5 版的新Function。
源代码: Lib/runpy.py
runpy模块用于查找和运行 Python 模块,而无需先导入它们。它的主要用途是实现-m命令行开关,该开关允许使用 Python 模块名称空间而不是文件系统来定位脚本。
runpy模块提供两个Function:
runpy.
run_module
(* mod_name , init_globals = None , run_name = None , alter_sys = False *)- 执行指定模块的代码,并返回生成的模块全局字典。首先使用标准导入机制定位模块的代码(有关详细信息,请参考 PEP 302),然后在新的模块名称空间中执行。
如果提供的模块名称引用的是软件包而不是普通模块,则导入该软件包,然后执行该软件包中的__main__
子模块,并返回结果模块全局字典。
可选的字典参数* init_globals *可用于在执行代码之前预先填充模块的全局字典。提供的词典将不会被修改。如果在提供的字典中定义了以下任何特殊全局变量,则这些定义将被run_module()覆盖。
在执行模块代码之前,在全局字典中设置了特殊的全局变量__name__
,__file__
,__loader__
和__package__
(请注意,这是最小的变量集-其他变量可以隐式设置为解释器实现细节)。
如果此可选参数不是None,则__name__
设置为* run_name ;如果命名模块为包,则__name__
设置为mod_name + '.__main__'
;否则将 mod_name *参数设置为mod_name + '.__main__'
。
__file__
设置为模块加载器提供的名称。如果加载程序不提供文件名信息,则此变量设置为None。
__loader__
设置为 PEP 302模块加载程序,用于检索模块代码(此加载程序可能是标准导入机制的包装器)。
如果命名模块是软件包,则__package__
设置为* mod_name *,否则设置为mod_name.rpartition('.')[0]
。
如果提供了参数* alter_sys *且其结果为True,则将sys.argv[0]
更新为__file__
的值,并将sys.modules[__name__]
更新为正在执行的模块的临时模块对象。函数返回之前,sys.argv[0]
和sys.modules[__name__]
都恢复为其原始值。
请注意,对sys的这种操作不是线程安全的。其他线程可能会看到部分初始化的模块,以及更改后的参数列表。从线程代码调用此Function时,建议不要单独使用sys模块。
See also
-m选项可从命令行提供等效Function。
在 2.7 版中进行了更改:增加了pass查找__main__
子模块来执行软件包的Function
runpy.
run_path
(* file_path , init_globals = None , run_name = None *)- 在指定的文件系统位置执行代码,并返回生成的模块全局字典。与提供给 CPython 命令行的脚本名称一样,提供的路径可能指向 Python 源文件,编译的字节码文件或包含
__main__
模块的有效 sys.path 条目(例如,包含顶级__main__.py
文件的 zipfile) 。
- 在指定的文件系统位置执行代码,并返回生成的模块全局字典。与提供给 CPython 命令行的脚本名称一样,提供的路径可能指向 Python 源文件,编译的字节码文件或包含
对于简单的脚本,只需在新的模块名称空间中执行指定的代码。对于有效的 sys.path 条目(通常是 zipfile 或目录),该条目首先添加到sys.path
的开头。然后,该函数使用更新后的路径查找并执行main模块。请注意,如果在指定位置没有这样的模块,则没有特殊的保护措施可以防止调用位于sys.path
其他位置的现有main条目。
可选的字典参数* init_globals *可用于在执行代码之前预先填充模块的全局字典。提供的词典将不会被修改。如果在提供的字典中定义了以下任何特殊全局变量,则这些定义将被run_path()覆盖。
在执行模块代码之前,在全局字典中设置了特殊的全局变量__name__
,__file__
,__loader__
和__package__
(请注意,这是最小的变量集-其他变量可以隐式设置为解释器实现细节)。
如果此可选参数不是None,则__name__
设置为* run_name *,否则设置为'<run_path>'
。
__file__
设置为模块加载器提供的名称。如果加载程序不提供文件名信息,则此变量设置为None。对于简单的脚本,它将设置为file_path
。
__loader__
设置为 PEP 302模块加载程序,用于检索模块代码(此加载程序可能是标准导入机制的包装器)。对于简单的脚本,它将设置为None。
__package__
设置为__name__.rpartition('.')[0]
。
sys模块也进行了许多更改。首先,可以如上所述改变sys.path
。使用file_path
的值更新sys.argv[0]
,使用正在执行的模块的临时模块对象更新sys.modules[__name__]
。函数返回之前,对sys中项目的所有修改都将还原。
请注意,与run_module()不同的是,对sys所做的更改在此函数中不是可选的,因为这些调整对于允许执行 sys.path 项至关重要。由于线程安全限制仍然适用,因此应在线程代码中使用导入锁序列化此函数,或将其委派给单独的进程。
See also
Interface options代表命令行上的等效Function(python path/to/script
)。
2.7 版的新Function。