1. 程式人生 > >Python 重新載入模組

Python 重新載入模組

簡述

在進行模組化程式設計時,經常會遇到這樣一種場景:

編寫了一個 Python 模組,並用 import my_module 的形式進行匯入。當對該模組進行更改後,即使重新匯入,其中的任何改變都不會被識別,這使得模組除錯變得非常困難。

那麼,該如何解決這個問題?

|

模組僅被匯入一次

出於效率原因(匯入必須找到檔案,將其編譯成位元組碼,並且執行程式碼),Python shell 在每次會話中,只對每個模組匯入一次。

例如,有一個名為 hello.py 的模組,包含以下程式碼:

print('Hello, Python!')

如果多次匯入,會出現什麼效果?

>>> 
import hello Hello, Python! >>> >>> import hello >>> import hello

可以看到,程式碼只執行了一次。也就是說,模組僅被匯入了一次。

重新載入模組

倘若,更改了已經在 Python shell 中匯入的模組,然後重新匯入該模組,Python 會認為“我已經匯入了該模組,不需要再次讀取該檔案”,所以更改將無效。

要解決這個問題,有以下幾種方式:

  1. 最簡單、最有效的方法:重新啟動 Python shell。但是,這也有缺點,特別是丟失了 Python shell 名稱空間中存在的資料以及其他匯入模組中的資料。
  2. 對於簡單的情況,可以使用 Python 的 reload() 函式。在許多情況下,在編輯一個模組之後就足夠了。
  3. 對於更復雜的情況,重新載入被編輯的模組也需要重新載入其依賴/匯入的模組(因為它們必須作為被編輯模組初始化的一部分進行初始化),所以 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'>