天天看點

Python中動态方式導入子產品

在Python中,如果要以動态方式導入子產品,可以執行以下操作:

module = __import__('module_name')      

如果要導入子子產品,你可能認為這隻是一個簡單的問題:

module = __import__('module_name.submodule')      

結果呢,當然不起作用了,你必須這麼做:

module = __import__('module_name.submodule', fromlist=['xxx'])      

為什麼?實際值fromlist似乎根本不重要,隻要它不是空的就行。

實際上,__import__内部也是import來實作的。 那麼我們在使用import的時候,一般有以下五種方式:

import pkg
import pkg.mod
from pkg import mod, mod2
from pkg.mod import func, func2
from pkg.mod import submod      

在前兩種情況下,import語句将最左側子產品對象配置設定給了: pkg。之後的​

​import pkg.mod​

​​可以這樣使用​

​pkg.mod.func()​

​,因為import語句引入了本地的子產品pkg,這是一個具有mod屬性的子產品對象。是以__import__函數必須傳回最左側的子產品對象,以便将其配置設定給pkg。這兩種情況相當于

pkg = __import__('pkg')
pkg = __import__('pkg.mod')      

後面三種情況,import就必須做更多的工作了,它必須從子產品對象擷取并配置設定多個名稱。但是__import__函數隻能傳回一個對象,并且它不能從子產品對象中檢索出多個名字,是以對于第三種情況就是:

pkg = __import__('pkg')
mod = pkg.mod
mod2 = pkg.mod2      

但是如果mod和mod2在該子產品pkg中尚未導入,那将無法生效。__import__函數需要知道mod和mod2是它可以通路的名稱,以便它可以檢視他們是否是子產品并且嘗試導入他們。是以像一下這個方式更為接近:

pkg = __import__('pkg', fromlist=['mod', 'mod2'])
mod = pkg.mod
mod2 = pkg.mod2      
tmp = __import__('pkg.mod', fromlist=['submod'])
submod = tmp.submod      

總結