我有兩個腳本 1 和 2,我需要這兩個腳本彼此獨立作業,但如果需要,我還需要腳本 2 才能使用腳本 1 中的函式。我試圖盡可能地自動化,所以每個腳本里面都已經定義了許多變數。
這是我正在談論的腳本的過度簡化示例。
腳本 1:
def plustwo(n):
out = n 2
print(out)
m=3
plustwo(m)
Result:
5
腳本 2:
from file import plustwo
z=5
plustwo(z)
Result:
5
7
如您所見,當我從腳本 1 匯入函式時,即使我使用from file import plustwo,也會匯入變數,這會導致腳本 2 回傳兩個結果,一個帶有變數m(5),另一個帶有變數z(7)。
我是否一定需要創建第三個腳本,與腳本 2 相同但沒有m變數?有沒有辦法從匯入中排除此類變數?(我只想要腳本 2 中的函式,以便我可以將腳本 1 與它已有的變數一起使用。)
uj5u.com熱心網友回復:
在腳本 1 中,您可以添加if __name__ == '__main__':,使其僅執行
m=3
plustwo(m)
如果程式直接從script1.py.
最后只需要稍微修改一下腳本1:
def plustwo(n):
out = n 2
print(out)
if __name__ == '__main__':
m=3
plustwo(m)
uj5u.com熱心網友回復:
不它不是。
一條import陳述句在第一次運行時總是會執行整個目標模塊。即使import寫成從目標檔案中挑選幾個函式和名稱,檔案仍然從第一行到最后一行執行——這就是語言的作業方式。
在此執行中創建的“模塊物件”(基本上是在模塊中全域定義的所有函式、類和變數的命名空間),它們在sys.modules字典中可用。在參考同一檔案的第二個匯入陳述句中,它不會再次運行:快取版本用于從中選擇任何函式或變數。
當模塊檔案對自身有直接副作用并且仍然希望它的一部分應該是可匯入的時,實踐是將您不想在匯入時執行的代碼放在一個僅在以下情況下運行的塊中自動變數__name__ 包含字串"__main__"。Python 這樣做是為了讓模塊“知道”一個模塊是作為主程式運行,還是作為更大系統的一部分被匯入。
這在 Python 專案中無處不在,通常看起來像:
...
if __name__ == "__main__":
# this block only runs when the coded is executed as the main program
m = 3
plustwo(m)
(由于顯而易見的原因,這出現在檔案末尾,在定義函式之后)
否則,唯一可能的解決方法是將模塊檔案作為文本檔案讀取,動態決議并重新生成另一個源檔案,僅包含感興趣的行,然后將其匯入。即便如此,以這種方式匯入的函式或類當然不可能處理同一模塊中的任何其他函式、類或變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/457214.html
