模塊
-
import如何工作
導入只發生一次
2. 找到模塊文件
3. 編譯成位碼(需要時)
4. 執行模塊的代碼來創建其所定義的對象Python把導入的模塊存貯到sys.moudles表中,並在導入操作的時候檢查該表,如果模塊不存在,將會啓動上面三個步驟。
-
搜索
大多數情況下,可以依賴模塊導入的路徑來搜索路徑,不需要額外配置路徑。但是,也可以自己預定義路徑,那麼搜索的順序:
-
程序的主目錄
-
PYHONPATH目錄(如果已經進行了設置)
import sys print(list(sys.path)) #手動添加目錄 sys.path.append('c:\\python\\modules') sys.path.append('c:/python/modules')
-
標準鏈接庫目錄
-
任何.pth文件的內容(如果存在的話)
在python安裝路徑的site-packages目錄下修建了PckPath.pth文件
/Users/lzhan/AI/python/project_modules/modules
-
-
編譯
當文件導入時,就會進行編譯。因此、通常不會看到程序頂層文件的.pyc字節碼文件。除非這個文件也被其他文件導入:只有被導入的文件纔會留下字節碼文件。頂層文件的字節碼是在內部使用後就丟棄了。
-
執行
和def一樣,import和form是可執行語句,而不是在編譯期間的聲明。直到python執行到這些語句時,纔會進行解析。
-
distutils
-
from
from會把模塊中的變量複製到另一個作用域,所以頂層文件中就可以直接使用該變量了。
import modulea from modulea import * #等價
from語句智能用在模塊文件的頂部,不能放在函數中。
所以下面代碼是等價的
from module import name1,name2 #等價於 import module name1=module.name1 name2=module.name2 del module
from語句有破壞命名空間的潛質!!
-
查看模塊命名空間
import public_var as p print(p.__dict__) print(dir(p))
-
reload()
-
reload是Python的內置函數,而不是語句
-
reload只能重載已經存在的模塊對象,而不是變量
-
relaod必須手動導入
import public_var as p from importlib import reload print(p.urls['first']) p.urls['first']='baidu.com' print(p.urls['first']) reload(p) print(p.urls['first'])
-
-
包導入
import modules.public_var from modules.public_var import *
注意
作爲包的目錄內必須存在__init__.py文件。