Python 重新載入模組
阿新 • • 發佈:2019-02-12
簡述
在進行模組化程式設計時,經常會遇到這樣一種場景:
編寫了一個 Python 模組,並用
import my_module
的形式進行匯入。當對該模組進行更改後,即使重新匯入,其中的任何改變都不會被識別,這使得模組除錯變得非常困難。
那麼,該如何解決這個問題?
|
模組僅被匯入一次
出於效率原因(匯入必須找到檔案,將其編譯成位元組碼,並且執行程式碼),Python shell 在每次會話中,只對每個模組匯入一次。
例如,有一個名為 hello.py
的模組,包含以下程式碼:
print('Hello, Python!')
如果多次匯入,會出現什麼效果?
>>> import hello
Hello, Python!
>>>
>>> import hello
>>> import hello
可以看到,程式碼只執行了一次。也就是說,模組僅被匯入了一次。
重新載入模組
倘若,更改了已經在 Python shell 中匯入的模組,然後重新匯入該模組,Python 會認為“我已經匯入了該模組,不需要再次讀取該檔案”,所以更改將無效。
要解決這個問題,有以下幾種方式:
- 最簡單、最有效的方法:重新啟動 Python shell。但是,這也有缺點,特別是丟失了 Python shell 名稱空間中存在的資料以及其他匯入模組中的資料。
- 對於簡單的情況,可以使用 Python 的
reload()
函式。在許多情況下,在編輯一個模組之後就足夠了。 - 對於更復雜的情況,重新載入被編輯的模組也需要重新載入其依賴/匯入的模組(因為它們必須作為被編輯模組初始化的一部分進行初始化),所以 IPython 的 autoreload 擴充套件很有用。
PS: 下面主要介紹第 2 種方式 - reload()
,其他方式自行嘗試。
reload()
是 Python 提供的一種簡潔的方式,在不同的 Python 版本中有不同的表現形式:
>>> import importlib
>>> import hello
Hello, Python! # 修改前的內容
>>>
>>> importlib.reload(hello)
I am coming... # 修改後的內容
<module 'hello' from '/home/wang/Projects/hello.py'>