2013-09-30 123 views
3

我在維護一個字典,並在配置文件中加載該字典。字典從JSON文件加載。導入語句:配置文件Python

在config.py

name_dict = json.load(open(dict_file)) 

我在其他幾個腳本導入此配置文件(file1.py,file2.py,...,filen.py)使用

import config 

聲明。我的問題是config.py腳本何時執行?我確定它不會被執行在我的多個腳本中進行的每個導入調用。但是,當調用導入語句時究竟發生了什麼。

回答

2

模塊中的頂級代碼被執行一次,第一次你import它。之後,模塊對象將在sys.modules中找到,並且代碼將不會被重新執行以重新生成它。

有一些例外情況:

  • reload,效果顯着。
  • 意外地在兩個不同的名稱下導入相同的模塊(例如,如果模塊在一個包中,並且在sys.path的包中間有一些目錄,則最終可能會有mypackage.mymodulemymodule爲兩個副本同樣的事情,在這種情況下代碼運行兩次)。
  • 安裝替代標準行爲的導入掛鉤/自定義導入。
  • 明確與sys.modules monkeying。
  • 直接調出imp/importlib之類的函數。
  • multiprocessing(以及間接使用它的模塊,如concurrent.futures)的某些情況。

對於Python 3.1和更高,這是The import system下詳細描述的所有。特別要看看搜索部分。 (multiprocessing - 針對該模塊描述了特定情況。)

對於早期版本的Python,您幾乎必須從各種不同來源推斷行爲,並閱讀代碼或進行試驗。然而,記錄良好的新行爲旨在像舊行爲一樣工作,除非以特定的方式描述,所以即使對於2.x,通常也可以閱讀3.x文檔。


注意一般,你不想依靠模塊中的頂級代碼是否被一次或多次運行。例如,給定一個頂級函數定義,只要你從不比較函數對象,或者重新綁定它(意味着定義本身,而不僅僅是身體)依賴的全局變量,它沒有任何區別。但是,有一些例外,加載啓動時配置文件是一個例外的完美例子。