??一般而言运沦,當(dāng)我們需要某些功能的模塊時(無論是內(nèi)置模塊或自定義功能的模塊)挪哄,可以通過import module 或者 from * import module的方式導(dǎo)入,這屬于靜態(tài)導(dǎo)入,很容易理解硕勿。
??而如果當(dāng)我們需要在程序的運行過程時才能決定導(dǎo)入某個文件中的模塊時,并且這些文件提供了同樣的接口名字厕妖,上面說的方式就不適用了首尼,這時候需要使用python 的動態(tài)導(dǎo)入。
??還有一種情況:我們有時希望從配置文件等地獲取要被動態(tài)加載的 module言秸,但是所讀取的配置項通常為字符串類型软能,無法用 import 加載,例如:
>>> import 'os'
File "<stdin>", line 1
import 'os'
^
SyntaxError: invalid syntax
??具體有兩種方法可以實現(xiàn)動態(tài)導(dǎo)入:
1举畸、用import_module函數(shù)執(zhí)行導(dǎo)入操作查排。
def import_module(name, package=None)
其中,name:為字符串形式抄沮,是要導(dǎo)入的模塊
栗子:
import importlib
class test():
def num(self):
np = importlib.import_module('numpy')
a = np.array([1,2,3])
print(a)
def num2(self):
b = np.array([1,2,3])
print(b)
def main():
t = test()
t.num()
# 下面的語句會報錯跋核,因為importlib.import_module導(dǎo)入的只是局部變量
# t.num2()
if __name__ == '__main__':
main()
輸出結(jié)果:[1 2 3]
2岖瑰、用Python 提供內(nèi)建函數(shù) _import_動態(tài)加載 module
import (name[, globals[, locals[, fromlist[, level]]]])
- name (required): 被加載 module 的名稱
- globals (optional): 包含全局變量的字典,該選項很少使用砂代,采用默認值 global()
- locals (optional): 包含局部變量的字典蹋订,內(nèi)部標(biāo)準實現(xiàn)未用到該變量,采用默認值 local()
- fromlist (Optional): 被導(dǎo)入的 submodule 名稱
- level (Optional): 導(dǎo)入路徑選項刻伊,默認為 -1露戒,表示同時支持 absolute import 和 relative import
(1)栗子:
In [21]: os_module = __import__('os')
In [22]: path = os_module.path.join('D','test')
In [23]: print(path)
D\test
注意:如果輸入的參數(shù)如果帶有 “.”,采用 _import_ 直接導(dǎo)入 module 容易造成意想不到的結(jié)果捶箱。
(2)栗子:
In [26]: osp = __import__('os.path')
In [27]: path = osp.join('D','test')
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-27-53ad0ef540e3> in <module>()
----> 1 path = osp.join('D','test')
AttributeError: module 'os' has no attribute 'join'
??錯誤提示說:os模塊沒有join屬性智什,好像不太對,我們導(dǎo)入的明明是:os.path模塊丁屎。這就說明 _import_ 只能導(dǎo)入第一級目錄荠锭。
In [28]: __import__("os")
Out[28]: <module 'os' from 'd:\\programs\\python\\python36\\lib\\os.py'>
In [29]: __import__("os.path")
Out[29]: <module 'os' from 'd:\\programs\\python\\python36\\lib\\os.py'>
??從上面的結(jié)果可以看出: 兩個導(dǎo)入的結(jié)果是一樣的,說明“.”后面的沒有被導(dǎo)入晨川。
參考:
http://python.jobbole.com/87492/
https://www.cnblogs.com/progor/p/8462472.html
https://blog.csdn.net/weixin_39769379/article/details/78497990