簡體   English   中英

Python 修改導入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM