Python 中模块的定位与执行

2025年3月17日 | 阅读 3 分钟

在本文中,我们将讨论用户如何在 Python 中定位模块以及使用哪些 Python 函数来执行模块。

在 Python 中定位模块

当用户导入模块时,Python 解释器会在当前目录中搜索该模块。如果在目录中找不到该模块,解释器将搜索名为 PYTHONPATH 的 shell 变量中存在的所有目录。如果解释器在 shell 中找不到它,它将检查默认路径。在 UNIX 中,此默认路径是:/usr/local/lib/python/。

模块的搜索路径存储在系统模块 sys 中,作为 sys.path 变量。该变量包含当前目录,即 PYTHONPATH,以及与安装相关的默认路径。

PYTHONPATH 变量

PYTHONPATH 变量是基于平台的变量,它由目录列表组成。其语法与 shell 变量的 PATH 相同。

来自 Windows 系统的 PYTHONPATH

来自 UNIX 系统的 PYTHONPATH

在 Python 中执行模块

通过命令行选项,-m 选项用于定位给定模块的路径,并将其作为程序的 __main__ 模块执行。runpy 模块是 Python 的标准模块,用于在内部支持此机制。runpy 模块允许通过使用 Python 模块的命名空间而不是文件系统来定位脚本。

runpy 模块定义了两个函数:

  1. run_module()
  2. run_path()

run_module()

run_module() 函数用于执行包含特定模块的代码,并将返回模块全局字典的结果。

module_name 参数应为实际的模块名称。假设模块名称指向的是一个包而不是普通模块。在这种情况下,该包将被导入,并且包内的 __main__ 子模块将被执行,它将返回模块全局字典的结果。

在执行模块之前,特殊的全局变量,即 __name__、__spec__、__file__、__cached__、__loader__ 和 __package__ 会被设置在全局字典中。

如果命名的模块是包,则 __name__ 设置为 module_name + '.__main__';否则,它将设置为 module_name 参数。

根据模块规范,__file__、__cached__、__loader__ 和 __package__ 会被正常设置。

run_path()

run_path() 函数用于执行给定路径的文件中的程序,并将模块全局字典作为结果返回。给定路径可以指向 Python 源文件、编译后的字节码文件,或者包含 __main__ 模块的有效 sys.path 条目,例如包含顶级 __main__.py 文件的 zipfile。

在执行模块之前,特殊的全局变量,即 __name__、__spec__、__file__、__cached__、__loader__ 和 __package__ 会被设置在全局字典中。

如果此可选参数不等于 None,则 __name__ 变量将设置为 run_name;否则,它将设置为 <run_path>。

示例

让我们看一个 runpy 模块的例子

首先,用户需要将以下文件保存为一个名为 runpy_example.py 的脚本。

然后,用户将使用以下命令执行上述文件

输出

sum of p, q, r, s, t = 
27

尽管如此,用户也可以在不导入它的情况下执行上述文件

输出

sum of p, q, r, s, t = 
27

Locating and Executing Modules in Python

用户还可以使用 run_path() 函数

输出

sum of p, q, r, s, t = 
27

Locating and Executing Modules in Python

如前所述,runpy 还支持 Python 命令行开关 -m

结论

在本文中,我们讨论了用户如何定位模块以及使用 Python 标准模块 runpy 模块中的函数来执行它们。