亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何卸載(重新加載)Python模塊?

如何卸載(重新加載)Python模塊?

森欄 2019-05-30 13:45:04
如何卸載(重新加載)Python模塊?我有一個長期運行的Python服務器,希望能夠在不重新啟動服務器的情況下升級服務。最好的辦法是什么?if foo.py has changed:     unimport foo  <-- How do I do this?     import foo     myfoo = foo.Foo()
查看完整描述

4 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

當模塊已經導入時,可以使用reload內置功能:

from importlib import reload  # Python 3.4+ only.import foowhile True:
    # Do some things.
    if is_changed(foo):
        foo = reload(foo)

在Python 3中,reload被移到imp模塊。在3.4,imp被反對贊成importlib,和reload加入了后者。當目標為3或更高版本時,在調用reload或者進口。

我想這就是你想要的。像Django的開發服務器這樣的Web服務器使用它,這樣您就可以看到代碼更改的效果,而無需重新啟動服務器進程本身。

引用文檔:

重新編譯Python模塊的代碼,重新執行模塊級的代碼,定義一組新的對象,這些對象綁定到模塊字典中的名稱。擴展模塊的init函數不是第二次調用。與Python中的所有其他對象一樣,只有在引用計數降到零之后,舊對象才會被回收。更新模塊命名空間中的名稱以指向任何新的或更改的對象。其他對舊對象的引用(例如模塊外部的名稱)不會反彈以引用新對象,如果需要的話,必須在它們出現的每個名稱空間中進行更新。

正如你在問題中指出的,你必須重建Foo對象的Foo類駐留在foo模塊。


查看完整回答
反對 回復 2019-05-30
?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

在Python3.0-3.3中,您將使用:imp.reload(module)

這個BDFL回答這個問題。

然而,imp在3.4中被否決,贊成importlib(謝謝@斯特凡!).

因此,您現在可以使用importlib.reload(module)雖然我不確定。


查看完整回答
反對 回復 2019-05-30
?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

如果一個模塊不是純Python,那么刪除它就會特別困難。

以下是以下內容:如何真正刪除導入的模塊?

您可以使用sys.getrefcount()查找引用的實際數量。

>>> import sys, empty, os>>> sys.getrefcount(sys)9>>> sys.getrefcount(os)6>>> sys.getrefcount(empty)3

大于3的數字表示很難擺脫模塊。自帶的“空”模塊(不包含任何內容)應該在之后被垃圾收集。

>>> del sys.modules["empty"]>>> del empty

第三個引用是getrefcount()函數的工件。


查看完整回答
反對 回復 2019-05-30
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

reload(module)但前提是它是完全獨立的。如果任何其他東西都有對模塊(或屬于模塊的任何對象)的引用,那么您將得到一些微妙而又奇怪的錯誤,這些錯誤是由舊代碼在您預期的時間內停留較長時間造成的,并且類似的情況如下isinstance不跨相同代碼的不同版本工作。

如果您有單向依賴項,則還必須重新加載所有依賴于重新加載模塊的模塊,以消除對舊代碼的所有引用。然后遞歸地重新加載依賴于重新加載模塊的模塊。

如果您有循環依賴項(例如在處理重新加載包時非常常見),則必須一次卸載組中的所有模塊。你不能用reload()因為它將在更新依賴項之前重新導入每個模塊,從而允許舊的引用進入新模塊。

在這種情況下,做這件事的唯一方法就是黑。sys.modules有點不受支持。你得逐個刪除sys.modules條目,希望在下一次導入時重新加載,并刪除值為None若要處理與緩存失敗的相對導入有關的實現問題,請執行以下操作。這不是很好,但只要您有一組完全獨立的依賴項,并且不將引用放在其代碼基之外,這是可行的。

最好重新啟動服務器。*-)


查看完整回答
反對 回復 2019-05-30
  • 4 回答
  • 0 關注
  • 2035 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號