第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

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

4 回答

?
縹緲止盈

TA貢獻2041條經(jīng)驗 獲得超4個贊

當模塊已經(jīng)導(dǎo)入時,可以使用reload內(nèi)置功能:

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或更高版本時,在調(diào)用reload或者進口。

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

引用文檔:

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

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


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

TA貢獻1775條經(jīng)驗 獲得超11個贊

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

這個BDFL回答這個問題。

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

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


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

TA貢獻1804條經(jīng)驗 獲得超8個贊

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

以下是以下內(nèi)容:如何真正刪除導(dǎo)入的模塊?

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

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

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

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

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


查看完整回答
反對 回復(fù) 2019-05-30
?
ibeautiful

TA貢獻1993條經(jīng)驗 獲得超6個贊

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

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

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

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

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


查看完整回答
反對 回復(fù) 2019-05-30
  • 4 回答
  • 0 關(guān)注
  • 2045 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號