1 模塊簡介
Python提供了importlib包作為標準庫的一部分。目的就是提供Python中import語句的實現(以及__import__函數)。另外,importlib允許程序員創建他們自定義的對象,可用于引入過程(也稱為importer)。
什么是imp?
另外有一個叫做imp的模塊,它提供給Python import語句機制的接口。這個模塊在Python 3.4中被否決,目的就是為了只使用importlib。
這個模塊有些復雜,因此我們在這篇博文中主要討論以下幾個主題:
•動態引入
•檢查模塊是否可以被引入
•引入源文件自身
•第三方模塊 import_from_github_com
2 模塊使用
2.1 動態引入
importlib模塊支持傳入字符串來引入一個模塊。我們創建兩個簡單的模塊來驗證這個功能。我們將會給予兩個模塊相同的接口,讓它們打印名字以便我們能夠區分它們。創建兩個模塊,分別為foo.py和bar.py,代碼如下所示,
def main(): print(__name__)
現在我們使用importlib來引入它們。讓我們看看這段代碼如何去做的。確保你已經把這段代碼放在與上面創建的兩個模塊相同的目錄下。
#importer.pyimport importlibdef dynamic_import(module): return importlib.import_module(module)if __name__ == "__main__": module = dynamic_import('foo') module.main() module_two = dynamic_import('bar') module_two()
在這段代碼中,我們手動引入importlib模塊,并創建一個簡單的函數dynamic_import。這個函數所做的就是調用importlib模塊中的import_module函數,入參就是我們傳入的字符串,然后返回調用結果。在代碼段的下面,我們調用每個模塊的main方法,將會打印出每個模塊的名稱。
在你的代碼中,你可能不會大量這樣做。當你只有一個字符串時,如果你想引入這個模塊,importlib就允許你可以這么做。
2.2 模塊引入檢查
Python有一個編碼規范就是EAPP:Easier to ask for forgiveness than permision。意思就是經常假設一些事情是存在的(例如,key在詞典中),如果出錯了,那么就捕獲異常。你可以看 Python標準模塊--import 文章中我們嘗試引入模塊,當它不存在時,我們就會捕獲到ImportError。如果我們想檢查并觀察一個模塊是否可以引入而不是僅僅是猜測,該如何去做?你可以使用importlib。代碼如下:
#coding:utf-8import importlib.utilimport importlibdef check_module(module_name): module_spec = importlib.util.find_spec(module_name) if module_spec is None: print("Module :{} not found".format(module_name)) return None else: print("Module:{} can be imported!".format(module_name)) return module_spec def import_module_from_spec(module_spec): module = importlib.util.module_from_spec(module_spec) module_spec.loader.exec_module(module) return moduleif __name__ == "__main__": module_spec = check_module("fake_module") module_spec = check_module("collections") if(module_spec): module = import_module_from_spec(module_spec) print(dir(module))
新聞熱點
疑難解答