runpy– 找到并执行Python模块

源代码: Lib / runpy.py


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

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

此外,执行代码定义的任何函数和类都不能保证在runpy函数返回后正常工作。如果对于给定的用例不能接受该限制,importlib可能是比这个模块更合适的选择.

runpy模块提供两个功能:

runpy.run_modulemod_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_namemod_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.2中更改:添加 __cached__全局变量(见PEP 3147 ).

版本3.4更改:更新以利用 PEP 451 添加的模块规格功能。这允许 __cached__以这种方式正确设置modulesrun,以及确保真正的模块名称始终可以作为__spec__.name.

runpy.run_pathfile_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_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编写和实现的PEP

命令行和环境 – CPython命令行详细信息

importlib.import_module()功能