__import__ 與動態載入 python module

發表於2017-03-17

Direct use of __import__() is rare, except in cases where you want to import a module whose name is only known at runtime.

本文介紹 python module 的動態載入,我們有時希望從配置檔案等地獲取要被動態載入的 module,但是所讀取的配置項通常為字串型別,無法用 import 載入,例如:

Python 提供內建函式 __import__ 動態載入 module,__import__ 的用法如下:

  • name (required): 被載入 module 的名稱
  • globals (optional): 包含全域性變數的字典,該選項很少使用,採用預設值 global()
  • locals (optional): 包含區域性變數的字典,內部標準實現未用到該變數,採用預設值 local()
  • fromlist (Optional): 被匯入的 submodule 名稱
  • level (Optional): 匯入路徑選項,預設為 -1,表示同時支援 absolute import 和 relative import

事實上,import 本質上是呼叫 __import__ 載入 module 的,比如:

但如果使用不善,也容易踩坑:

如果輸入的引數如果帶有 “.”,採用 __import__ 直接匯入 module 容易造成意想不到的結果。 OpenStack 的 oslo.utils 封裝了 __import__,支援動態匯入 class, object 等。

相關文章