溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在Jupyter中重新導(dǎo)入特定的Python文件

發(fā)布時(shí)間:2021-08-13 17:21:18 來(lái)源:億速云 閱讀:218 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“如何在Jupyter中重新導(dǎo)入特定的Python文件”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何在Jupyter中重新導(dǎo)入特定的Python文件”這篇文章吧。

Jupyter 是數(shù)據(jù)分析領(lǐng)域非常有名的開發(fā)環(huán)境,使用 Jupyter 寫數(shù)據(jù)分析相關(guān)的代碼會(huì)大大節(jié)約開發(fā)時(shí)間。

設(shè)想這樣一個(gè)場(chǎng)景:別的部門的同事傳給你一個(gè)數(shù)據(jù)分析的模塊,用于實(shí)現(xiàn)對(duì)數(shù)據(jù)的高級(jí)分析。模塊里面有上百個(gè)函數(shù)。

如果直接寫 Python 文件來(lái)調(diào)用數(shù)據(jù)分析模塊,那么使用方法非常簡(jiǎn)單:

from analyze import FathersAnalyzer

data = [...]
father = FathersAnalyzer(data)
result = father.analyze()
print(f'分析結(jié)果為:{result}')

現(xiàn)在,你需要使用 Jupyter 來(lái)調(diào)用這個(gè)分析模塊。你應(yīng)該怎么在 Jupyter里面調(diào)用?

你可能會(huì)覺得,這還不簡(jiǎn)單嗎?直接把這個(gè)模塊的代碼與 Jupyter Notebook 的 .ipynb 文件放在一起,然后在 Jupyter 里面像導(dǎo)入普通模塊那樣導(dǎo)入即可,如下圖所示:

如何在Jupyter中重新導(dǎo)入特定的Python文件

那么現(xiàn)在問(wèn)題來(lái)了,如果我此時(shí)修改了 analyze.py 文件,會(huì)出現(xiàn)什么情況呢?

我們改一下看看,如下圖所示。

如何在Jupyter中重新導(dǎo)入特定的Python文件

重新運(yùn)行這個(gè) Cell 中的代碼,代碼中雖然有 from analyze import FathersAnalyzer ,看起來(lái)像是重新導(dǎo)入了這個(gè)模塊,但是運(yùn)行卻發(fā)現(xiàn),它運(yùn)行的是修改之前的代碼。

這是因?yàn)?,一個(gè) Jupyter Notebook 中的所有代碼,都是在同一個(gè)運(yùn)行時(shí)中運(yùn)行的代碼,當(dāng)你多次導(dǎo)入同一個(gè)模塊時(shí),Python 的包管理機(jī)制會(huì)自動(dòng)忽略后面的導(dǎo)入,始終只使用第一次導(dǎo)入的結(jié)果(所以使用這種方式也可以實(shí)現(xiàn)單例模式)。

那么如果我在修改了被導(dǎo)入的包以后,想重新導(dǎo)入它怎么辦呢?有3種方案:

importlib

如何在Jupyter中重新導(dǎo)入特定的Python文件

但這種方案弊端也很明顯——除非你按順序運(yùn)行每一個(gè) Cell,否則,你的代碼會(huì)變成下圖這樣:

如何在Jupyter中重新導(dǎo)入特定的Python文件

在每一個(gè) Cell 里面都需要 重新加載一次分析模塊,否則,很有可能在你單獨(dú)運(yùn)行某一個(gè) Cell 的時(shí)候,用的是老的代碼,就會(huì)導(dǎo)致難以察覺的 bug。

使用 Jupyter 自帶的 %autoreload :

%load_ext autoreload
%autoreload 1
%aimport analyze 

data = 123
importlib.reload(analyze)
father = analyze.FathersAnalyzer(data)
result = father.analyze()
print(result)

運(yùn)行效果如下圖所示:

如何在Jupyter中重新導(dǎo)入特定的Python文件

其中關(guān)鍵的代碼有三行:

%load_ext autoreload
%autoreload 1
%aimport analyze

這三行代碼只有在 Jupyter 里面才能正常運(yùn)行,在 普通的.py 文件里面這樣寫會(huì)報(bào)錯(cuò)。它們的作用是:第1行啟動(dòng) autoreload 機(jī)制。第2行,設(shè)置自動(dòng)加載通過(guò) %aimport 導(dǎo)入的模塊。第3行使用 %aimport 導(dǎo)入 analyze 模塊。

這樣寫以后,任意一個(gè) Cell 運(yùn)行,所有被 %aimport 導(dǎo)入的模塊都會(huì)被重新加載一次。從而讓你每次都使用最新的代碼。

當(dāng)然,你還可以進(jìn)一步偷懶,把特殊代碼縮減為2行:

%load_ext autoreload
%autoreload 2

%autoreload 后面的參數(shù)被設(shè)置為2時(shí),每次運(yùn)行任意一個(gè) Cell,都會(huì)自動(dòng)重新加載所有 import xxx 導(dǎo)入的模塊。這樣做的代價(jià)是,運(yùn)行會(huì)慢一些。

以上是“如何在Jupyter中重新導(dǎo)入特定的Python文件”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI