在 Jupyter 中重新導(dǎo)入特定的 Python 文件(場(chǎng)景分析)
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)入即可,如下圖所示:
那么現(xiàn)在問(wèn)題來(lái)了,如果我此時(shí)修改了 analyze.py
文件,會(huì)出現(xiàn)什么情況呢?
我們改一下看看,如下圖所示。
重新運(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
但這種方案弊端也很明顯——除非你按順序運(yùn)行每一個(gè) Cell,否則,你的代碼會(huì)變成下圖這樣:
在每一個(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)行效果如下圖所示:
其中關(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ì)慢一些。
總結(jié)
以上所述是小編給大家介紹的在 Jupyter 中重新導(dǎo)入特定的 Python 文件的方法,希望對(duì)大家有所幫助!
- 文件上傳服務(wù)器-jupyter 中python解壓及壓縮方式
- jupyter notebook參數(shù)化運(yùn)行python方式
- jupyter notebook 使用過(guò)程中python莫名崩潰的原因及解決方式
- JupyterNotebook設(shè)置Python環(huán)境的方法步驟
- win10下安裝Anaconda的教程(python環(huán)境+jupyter_notebook)
- windows系統(tǒng)中Python多版本與jupyter notebook使用虛擬環(huán)境的過(guò)程
- python把ipynb文件轉(zhuǎn)換成pdf文件過(guò)程詳解
- Python使用jupyter notebook查看ipynb文件過(guò)程解析
相關(guān)文章
Python中join()函數(shù)多種操作代碼實(shí)例
這篇文章主要介紹了Python中join()函數(shù)多種操作代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01Python使用pickle模塊儲(chǔ)存對(duì)象操作示例
這篇文章主要介紹了Python使用pickle模塊儲(chǔ)存對(duì)象操作,結(jié)合實(shí)例形式分析了Python使用pickle模塊針對(duì)文件讀寫與轉(zhuǎn)換的相關(guān)操作技巧,需要的朋友可以參考下2018-08-08python機(jī)器學(xué)習(xí)基礎(chǔ)特征工程算法詳解
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)基礎(chǔ)特征工程的算法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11解決Python?Pandas?DataFrame表格打印輸出不能對(duì)齊的問(wèn)題
這篇文章主要介紹了解決Python?Pandas?DataFrame表格打印輸出不能對(duì)齊的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09Python查找不限層級(jí)Json數(shù)據(jù)中某個(gè)key或者value的路徑方式
今天小編就為大家分享一篇Python查找不限層級(jí)Json數(shù)據(jù)中某個(gè)key或者value的路徑方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02