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) 。

对于简单的脚本,只需在新的模块名称空间中执行指定的代码。对于有效的 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。

See also

  • PEP 338 –将模块作为脚本执行

  • PEP 由 Nick Coghlan 编写和实施。

  • PEP 366 –主模块显式相对导入

  • PEP 由 Nick Coghlan 编写和实施。

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