Python 中 import 的實現(importlib)


importlib 包提供了 Python 原始碼中 import 語句的實現,可移植到任何 Python 直譯器。這還提供了一個比用其他程式語言實現的更容易理解的實現。

此包還公開了實現 import 的元件,使使用者更容易建立自己的自定義物件(稱為匯入器)以參與 import 過程。

importlib 包有一個名為 import_module() 的重要函式。

import_module()

此函式以程式設計方式匯入模組。模組名稱是函式的第一個引數。可選的第二個引數指定包名稱(如果有)。

invalidate_caches()

此函式使查詢器的內部快取失效。如果在程式執行期間建立/安裝了任何模組,則應呼叫此函式,以保證所有查詢器都會注意到新模組的存在。

reload()

此函式重新載入先前匯入的模組。如果您使用外部編輯器編輯了模組原始檔並希望在不退出 Python 直譯器的情況下嘗試新版本,這將很有用。

示例

建立兩個名為 module1.py 和 module2.py 的 Python 指令碼,程式碼如下所示

#module1
def main():
   print ('module imported', __name__)
   return
if __name__=='__main__':
   main()

現在,我們使用 importlib 包動態匯入這些模組。

>>> import importlib
>>> mod=importlib.import_module('module1')
>>> mod.__name__
'module1'
>>> mod=importlib.import_module('module2')
>>> mod.__name__
'module2'
>>> mod.main()
module imported module2
>>>

importlib 包包含以下子模組

importlib.abc

此模組包含 import 使用的所有核心抽象基類。還提供了一些核心抽象基類的子類,以幫助實現核心 ABC。

importlib.resources

此模組利用 Python 的 import 系統來訪問包中的資源。

importlib.machinery

此模組包含幫助 import 查詢和載入模組的各種物件。

importlib.util

此模組包含匯入器的實用程式程式碼。它包含幫助構建匯入器的各種物件。在其中定義了以下重要函式。

find_spec()

此函式查詢模組的規範,相對於指定的包名稱。如果名稱是子模組(包含點),則會自動匯入父模組。名稱和包的工作方式與 import_module() 相同。

module_from_spec(spec)

基於 spec 和 spec.loader.create_module 建立一個新模組。

示例

import importlib.util
def check_module(mod):
   spec = importlib.util.find_spec(mod)
   if spec is None:
      print('Module: {} not found'.format(mod))
      return None
   else:
      print('Module: {} can be imported!'.format(mod))
      return spec
   def import_module(spec):
      mod = importlib.util.module_from_spec(spec)
      spec.loader.exec_module(mod)
      return mod
if __name__ == '__main__':
   spec = check_module('notamodule')
   spec = check_module('module1')
   if spec:
      mod = import_module(spec)
      mod.main()

輸出

Module: notamodule not found
Module: module1 can be imported!
module imported module1

更新於: 2019年7月30日

2K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告