[英]Python import with modification
我總是按照以下方式構建我的回購協議。
repo/main.py
repo/scripts/script.py
…
在 main.py 中,我按以下方式導入 script.py:
from scripts import script as sc
除非我決定對 script.py 進行更改,否則這始終有效。 進行更改后,如果我從 shell 運行 main.py,它仍然會從沒有當前更改的舊 script.py 導入代碼。 到現在為止,我只是創建另一個分支。 但是,這會導致開發過程中出現很多分支。 有什么辦法可以避免這種情況嗎? 我還應該如何從腳本目錄導入以避免這種情況?
幫助將不勝感激。
更新從答案中,我可以看出我造成了一些混亂。 當我說我從 shell 運行 main.py 時,我的意思是從終端用python main.py
執行它。 可以將main.py視為執行一些數學運算並輸出答案的腳本。 在進行這些計算時,它從具有它 ( main.py ) 使用的附加函數的腳本中導入script.py 。 運行main.py N 次后,如果我選擇更新script.py ,然后再次執行main.py (在終端中),它會再次導入舊的script.py並使用舊代碼進行數學計算。 答案並未反映我剛剛對script.py所做的更改。 到現在為止,我所做的,當我不得不通過這樣的事情 go 時,只是創建另一個新分支,然后在新分支中復制粘貼舊文件和較新的script.py ,並在shell中執行 main.py . 然后它確實導入了較新的script.py 。 我注意到的另一件事是,如果我只是創建一個新文件,比如script2.py ,然后將其導入main.py中
from scripts import script2 as sc
它按原樣導入script2.py - 它反映了對script.py所做的所有更改。
main.py中沒有第二個import語句。
從表面上看,這個問題聽起來像是我們在重復運行$ python main.py
,它會快速執行並退出。
但是從症狀來看,一定是我們有一個長期存在的 REPL 提示重復執行 main.py 代碼。
您正在尋找的模塊是importlib 。
做這個:
from importlib import reload
from scripts import script as sc
# [do stuff, then edit script.py]
reload(sc)
# [do more stuff, and see the effect of the edit]
這里發生了什么?
好吧,如果你反復執行
import scripts.script
import scripts.script
事實證明,第二次和隨后的導入什么都不做。 它查詢sys.modules
,發現模塊已經加載,並報告“緩存命中”。 而不是做拉入該文本文件的艱苦工作。
reload()
function 的目的是使緩存無效並重復導入,因此它實際上從(可能已編輯的)源文件中提取 python 文本。
假設您有一個短暫的$ python main.py
進程重復運行,有時在 script.py 編輯之后。 所以內存中的sys.module
緩存是不相關的,每次進程退出時都會被丟棄。 這里還有另一個級別的緩存在起作用。
通常,cPython 解釋器將讀取script.py
、解析、從解析樹生成字節碼,並將字節碼寫入script.pyc
。 可能有多個 output 緩存目錄,具體取決於系統詳細信息。
在被要求讀取script.py
時,解釋器可以查看相應的.pyc
字節碼文件是否可用且新鮮,然后聲明“緩存命中”,在這種情況下甚至不會讀取.py
源文件。 通常這很有效,因為源文件更新很少(人工編輯速度),並且文件時間戳的新鮮度比較是有效的。 如果這些時間戳有問題,整個機制將無法正常工作,我們可能無法注意到源最近被編輯過。 或許你正受此困擾。
首先,識別相關的.pyc
字節碼文件。
然后,運行main,進行編輯,刪除.pyc
文件,重新運行main,注意編輯生效了。
讓我們知道進展如何。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.