在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