runpy

2.5版本中的新功能。

源代码: Lib / runpy.py

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

runpy模块提供两个功能:

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__是在全局字典执行模块代码之前设置(注意,这是一组变量最小-其他变量可以被隐式设置为一个解释实现细节)。

__name__如果此可选参数不是,则设置为run_name;否则Nonemod_name + '.__main__'如果命名模块是包,则返回mod_name参数。

__file__被设置为由模块加载器提供的名称。如果加载程序没有提供文件名信息,则将此变量设置为None

__loader__设置为用于检索模块代码的PEP 302模块加载器(此加载器可能是标准导入机制的包装器)。

__package__如果命名的模块是一个包,则设置为mod_namemod_name.rpartition('.')[0]

如果参数alter_sys供给和的计算结果为True,然后sys.argv[0]用的值进行更新__file__,并sys.modules[__name__]与正在执行的模块的临时模块的对象更新。双方sys.argv[0]sys.modules[__name__]恢复到原来的值在函数返回之前。

请注意,这种操作sys不是线程安全的。其他线程可能会看到部分初始化的模块,以及更改的参数列表。建议在sys从线程代码调用此函数时将模块保留为独立模式。

另请参阅

-m选项提供了与命令行相同的功能。

在版本2.7中更改:通过查找__main__子模块增加了执行包的功能

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

在指定的文件系统位置执行代码并返回生成的模块全局变量字典。与提供给CPython命令行的脚本名称一样,提供的路径可能引用Python源文件,编译的字节码文件或包含__main__模块的有效sys.path条目(例如包含顶级__main__.py文件的zip 文件)。

对于简单的脚本,指定的代码只是在新的模块名称空间中执行。对于有效的sys.path条目(通常是一个zip文件或目录),该条目首先添加到开头sys.path。该功能然后__main__使用更新的路径查找并执行模块。请注意,如果在指定位置没有此类模块,则没有针对调用__main__位于其他位置的现有条目的特殊保护sys.path

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

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

__name__如果此可选参数不是,则设置为run_nameNone'<run_path>'

__file__被设置为由模块加载器提供的名称。如果加载程序没有提供文件名信息,则将此变量设置为None。对于简单的脚本,这将被设置为file_path

__loader__设置为用于检索模块代码的PEP 302模块加载器(此加载器可能是标准导入机制的包装器)。对于简单的脚本,这将被设置为None

__package__ is set to __name__.rpartition('.')[0].

sys模块也进行了一些改动。首先,sys.path可以如上所述进行改变。sys.argv[0]用正在执行的模块的临时模块对象的值更新file_pathsys.modules[__name__]更新。sys在函数返回之前,所有对项目的修改都会被恢复。

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

另请参阅

命令行上的等效功能的接口选项python path/to/script)。

2.7版本的新功能。

另请参阅

PEP 338 - 执行由Nick Coghlan编写和执行的作为脚本PEP的模块。 PEP 366 - 主要模块显式相对进口PEP由Nick Coghlan编写和实施。

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

扫码关注云+社区

领取腾讯云代金券