python在執行環境初始化中,就將sys module載入到了記憶體中,
實際上,python是將一大批的module載入到了記憶體中。但是為了使local名字空間能夠達到最乾淨的效果,python並沒有將這些符號暴露在當前的local名字空間中,
而是需要使用者顯式的通過import機制通知python:需要將這個符號引入到local名字空間中。這些預先被載入進記憶體的module存放在sys.modules中
可以看到os module是從c:\python25\lib\os.pyc這個檔案中引入的,它是乙個內建的module。通過import機制,這個module被引入到了當前的local名字空間。從兩個不同id操作中可以看到,python虛擬機器的import動作引入的正是事先已經在python初始化階段被載入到sys.modules集合中的os module。
在usermodule1.py和usermodule2.py中進行的import動作並沒有影響到上一層的名字空間,而只是影響到了各個module自身的名字空間,更準確的說是影響到了各個module自身所維護的那個dict物件。
實際上,所有的import動作都會影響到全域性module集合,即如果程式的另一處再次import這個module,python虛擬機器只需要將全域性module集合中快取的那個module物件返回即可。
import之前的命名空間: ['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
import之後的命名空間: ['a', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
a的local命名空間 ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'tank']
相同點:import之前的命名空間: ['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
import之後的命名空間: ['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'tank']
兩者都將a.tank module以及a作為moudle新增到sys.modules集合中
sys.modules['a']
sys.modules['a.tank']
不同點:
import a.tank 在local命名空間中引入符合"a",並且將其對映到module a
from a import tank python虛擬機器在local命名空間中引入符合"tank",並將其對映到module a.tank
之前的例子都是通將module自身的名字暴露到了當前的local命名空間,python通過as關鍵字可以控制module以什麼名字引入到當前的local命名空間中。
當前local命名空間中的tank實際被對映到了module a.tank。import a.tank 在命名空間引入的是符號"a",而使用as後,引入的是"tank",所以當前命名空間中無法訪問到a了
只是刪除了符號"tank",並沒有真正從sys.modules集合中刪除module
只是向對應的module中新增新的符號,如果有符號在原始檔中被刪除,這種刪除是不會影響到module所維護的dict的。
Python的動態載入機制
1 python所有的模組載入到記憶體後,都會放在sys.modules中。當我們在乙個檔案中import乙個模組的時候,python會先去sys.modules中查詢是否已經載入過這個模組,如果是,則將這個模組的名字加入到正在呼叫import的local命名空間中 如果沒有載入過這個模組,則從sy...
Python動態載入模組
需求 實現乙個簡單的pyton程式,接收兩個引數 plugin name,data,根據不同的plugin name定位到不同的邏輯處理模組並進行輸出。實現方案 使用python的庫函式 load source,將外掛程式模組載入到乙個dict中key為模組名稱,value為類的例項,核心 def ...
Lua動態載入模組
function reload modulename package.loaded modulename nil require modulename end 使用以上 即可重新載入乙個檔案。這樣修改完lua 後,可以不用重啟程式立刻生效。模組a a function a.test1 print 1...