python直譯器如何知道何時編譯和更新.pyc檔案?
所說的那樣.
我認為python直譯器正在使用時間戳來檢測.pyc是否比.py更新,如果是,則在執行時再次跳過編譯. (makefile的做法)
所以,我做了一個測試,但似乎我錯了.
>我寫的t.py包含列印’123′,t1.py包含匯入
噸.執行命令python t1.py給出了輸出123和
生成t.pyc,全部如預期.
>然後我將t.py編輯為列印’1234’並更新了時間戳
t.pyc通過觸控t.pyc.
>再次執行python t1.py,我以為我會得到123但是1234
確實.所以似乎python直譯器仍然知道t.py
已更新.
然後,我想知道python直譯器是否會在每次執行python t1.py時編譯和生成t.pyc.但是,當我執行python t1.py幾次,我發現t.pyc不會被更新,當t.py沒有更新.
所以,我的問題是:python直譯器如何知道何時編譯和更新.pyc檔案?
更新
由於python直譯器正在使用儲存在.pyc檔案中的時間戳.我認為這是.pyc最後更新時間的記錄.匯入時,將其與.py檔案的時間戳進行比較.
所以我試圖以這種方式進行攻擊:將作業系統時間更改為較舊的作業系統,並編輯.py檔案.
我以為再次匯入時,.py似乎比.pyc更老,而python直譯器不會更新.pyc.但我又錯了.
那麼,python直譯器比較這兩個時間戳不是以較舊的或較新的方式,而是以完全相同的方式?
以相當的方式,我的意思是.pyc中的時間戳記記錄了.py最後一次修改的時間.匯入時,它將時間戳與.py的當前時間戳進行比較,如果它不一樣,重新編譯和更新.pyc.
看起來時間戳直接儲存在* .pyc檔案中. python直譯器不依賴於檔案的最後一個修改屬性,也許是為了避免在複製原始碼樹時出現不相容的位元組碼問題.
看看
the python implementation of theimport
statement
,你可以在
_validate_bytecode_header()
找到過期的檢查.通過它的外觀,它提取位元組4到7(包括),並將其與原始檔的時間碼進行比較.如果這些不匹配,位元組碼被認為是停頓的,因此重新編譯.
在這個過程中,它還根據用於生成給定位元組碼的源的長度(儲存在位元組8到11)來檢查原始檔的長度.
在python實現中,如果其中一個檢查失敗,位元組碼載入器將引發一個由
SourceLoader.get_code()
捕獲的ImportError,該引用觸發器重新編譯位元組碼.
注意:這是在python版本的importlib中完成的.我猜,本機版本沒有任何功能差異,但我的C有點生鏽,不能挖掘編譯器程式碼
http://stackoverflow.com/questions/23775760/how-does-the-python-interpreter-know-when-to-compile-and-update-a-pyc-file