我在維護一個字典,並在配置文件中加載該字典。字典從JSON文件加載。導入語句:配置文件Python
在config.py
name_dict = json.load(open(dict_file))
我在其他幾個腳本導入此配置文件(file1.py,file2.py,...,filen.py)使用
import config
聲明。我的問題是config.py腳本何時執行?我確定它不會被執行在我的多個腳本中進行的每個導入調用。但是,當調用導入語句時究竟發生了什麼。
我在維護一個字典,並在配置文件中加載該字典。字典從JSON文件加載。導入語句:配置文件Python
在config.py
name_dict = json.load(open(dict_file))
我在其他幾個腳本導入此配置文件(file1.py,file2.py,...,filen.py)使用
import config
聲明。我的問題是config.py腳本何時執行?我確定它不會被執行在我的多個腳本中進行的每個導入調用。但是,當調用導入語句時究竟發生了什麼。
模塊中的頂級代碼被執行一次,第一次你import
它。之後,模塊對象將在sys.modules
中找到,並且代碼將不會被重新執行以重新生成它。
有一些例外情況:
reload
,效果顯着。sys.path
的包中間有一些目錄,則最終可能會有mypackage.mymodule
和mymodule
爲兩個副本同樣的事情,在這種情況下代碼運行兩次)。sys.modules
monkeying。imp
/importlib
之類的函數。multiprocessing
(以及間接使用它的模塊,如concurrent.futures
)的某些情況。對於Python 3.1和更高,這是The import system下詳細描述的所有。特別要看看搜索部分。 (multiprocessing
- 針對該模塊描述了特定情況。)
對於早期版本的Python,您幾乎必須從各種不同來源推斷行爲,並閱讀代碼或進行試驗。然而,記錄良好的新行爲旨在像舊行爲一樣工作,除非以特定的方式描述,所以即使對於2.x,通常也可以閱讀3.x文檔。
注意一般,你不想依靠模塊中的頂級代碼是否被一次或多次運行。例如,給定一個頂級函數定義,只要你從不比較函數對象,或者重新綁定它(意味着定義本身,而不僅僅是身體)依賴的全局變量,它沒有任何區別。但是,有一些例外,加載啓動時配置文件是一個例外的完美例子。