如何根據完整路徑匯入 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+ 次瀏覽

開啟您的職業生涯

透過完成課程獲得認證

開始學習
廣告