如何根据完整路径导入 Python 模块?


Python 中的文件处理 中,解决文件处理的不同任务是一个反复且例行的任务。其中一种情况是需要从系统上的某个位置导入模块。Python 拥有合适的工具来提供 动态导入模块 的功能,前提是它们的完整路径可访问。此类规定使 Python 代码展现出灵活性和模块化的强大功能。本文探讨了在给定完整路径时导入 Python 模块的各种不同方法;每种方法都为各种用例提供了独特的优势。在这里,我们试图通过分步说明和真实的代码示例来有效地指导您完成每种方法。在本文结束时,您将具备从任何所需位置动态导入模块的技能。让我们深入了解使用完整路径导入 Python 模块的世界。

了解通过完整路径导入 Python 模块

我们首先尝试掌握通过完整路径导入 Python 模块的概念。然后,我们将继续讨论代码示例及其说明。 Python 解释器 通常会在 sys.path 列表中给定的某些目录中搜索模块。但是,可以通过管理 sys.path 或利用内置函数和库从任何位置动态导入模块。

使用 importlib.util.spec_from_file_location()

在我们的第一个示例中,演示了如何使用 importlib.util.spec_from_file_location() 通过完整路径导入 Python 模块。

在此代码片段中,定义了一个名为 by_path() 的函数 import_module_is;它以 module_path 作为参数。我们为要导入的模块提供了一个称为 module_name 的自定义名称。我们使用 importlib.util.spec_from_file_location() 根据提供的文件位置创建模块规范。接下来,我们继续使用 importlib.util.module_from_spec() 从给定的规范生成模块对象。最后,spec.loader.exec_module() 用于执行模块代码,并且模块已准备好使用。

import importlib.util

def import_module_by_path(module_path):
   module_name = "custom_module"  # Provide a custom name for the module

   spec = importlib.util.spec_from_file_location(module_name, module_path)
   custom_module = importlib.util.module_from_spec(spec)
   spec.loader.exec_module(custom_module)

   return custom_module

使用 imp.load_source()(Python 3.4 中已弃用)

在下一个示例中,它显示了如何通过使用 imp.load_source() 方法(已弃用)通过完整路径导入模块。

这里,定义了相同的函数 import_module_by_path();但是,我们使用现已弃用的 imp.load_source() 方法导入模块。尽管此方法有效,但必须注意,它在 Python 3.4 中已弃用,并且可能会在未来的 Python 版本 中删除。因此,建议使用 importlib 方法 以获得更好的可维护性和兼容性。

import imp

def import_module_by_path(module_path):
   module_name = "custom_module"  # Provide a custom name for the module

   custom_module = imp.load_source(module_name, module_path)

   return custom_module

使用 importlib.machinery.SourceFileLoader()

这里,利用了一种替代方法,其中 importlib.machinery.SourceFileLoader() 用于通过完整路径导入模块。

我们使用 importlib.machinery.SourceFileLoader()module_path 指示的模块创建一个加载器。然后,加载器的 load_module() 方法用于导入和加载模块。此策略提供了一种从特定位置导入模块的替代方法。

import importlib.machinery

def import_module_by_path(module_path):
   module_name = "custom_module"  # Provide a custom name for the module

   loader = importlib.machinery.SourceFileLoader(module_name, module_path)
   custom_module = loader.load_module()

   return custom_module

使用 runpy.run_path()

最后,在此最后一个示例中,我们使用 runpy.run_path() 执行来自文件中的代码并获取结果命名空间。

我们首先定义函数 import_module_by_path()。然后,我们继续使用 runpy.run_path() 执行指定文件(由 module_path 描述)中的代码并获取结果命名空间。当您希望评估和使用所需模块中的代码时,此方法很有用。

import runpy

def import_module_by_path(module_path):
   module_namespace = runpy.run_path(module_path)

   return module_namespace

通过完整路径导入 Python 模块的行为允许您引入来自系统上几乎任何位置的模块的功能,这增强了代码的灵活性和模块化。考虑到各种方法,如 importlib.util.spec_from_file_location()imp.load_source()(已弃用)、importlib.machinery.SourceFileLoader()runpy.run_path(),我们必须意识到每种方法根据项目的具体需求提供了独特的优势。

在您继续 Python 之旅的过程中,必须记住,动态导入模块的技能开辟了许多可能性。此类技能为您的项目带来了灵活性和强大的功能,使您能够创建更有条理和模块化的代码库。

更新于: 2023年8月28日

24K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告