如何在Python程式碼中建立一個函數,以IPython富輸出(HTML格式)作為輸出?
P粉713846879
2023-08-31 21:59:28
<p>如何建立一個名為<code>foo()</code>的函數,使得</p>
<pre class="brush:php;toolbar:false;">pycode = '''
from matplotlib import pyplot as plt
plt.plot([1, 2, 3])
plt.show()
'''
out = foo(pycode)</pre>
<p>其中<code>out</code>是ipython或jupyter notebook會輸出的富文本HTML輸出</p>
<p>有沒有ipython中內建的函數可以實現這個?我猜應該有,但我在谷歌上找不到。 </p>
<p>編輯:我希望這個函數存在於我的Python腳本中,而不是在運行ipython shell時。 </p>
<p>編輯:我想要做的是基本上重新創建類似於jupyter notebook單元格的東西,我給它代碼,它以可視化的方式返回富輸出(可能以HTML形式),就像jupyter notebook單元格一樣。 </p>
我認為你正在尋找Python的
exec()
方法?在安裝了matplotlib的JupyterLab中,你可以在一個單元格中運行以下程式碼,並在其下方看到輸出:
請記住,一般情況下不建議使用
exec()
和相關的eval()
。它們的使用可能會使其他人甚至你自己無意中執行你不想運行的程式碼,從而引發嚴重問題。如果你使用正確的方法,通常不需要使用它們,可以參考這裡。 (現在似乎甚至可以使用基於WebAssembly的Python來執行,請參閱PyScript: is it possible to execute an uploaded Python script?。)根據第一個評論的回應更新:
如此寫的話,儘管程式碼能夠繪製圖形,但
out
並沒有收集任何內容,因為exec(pycode)
恰好在最後一行。可以透過使用IPython的捕獲工具來收集RichOutput。而且,由於它是透過導入來實現的,如果你在Python中也安裝了Jupyter生態系統,它應該也能夠運作。換句話說,儘管我在notebook中示範它,你可以寫一個函數來使用return captured.outputs[0]
,它將傳回繪圖的RichOutput。在這個notebook中詳細闡述了底層的原理。
請注意,由於我處理的是RichOutput和生成圖像,你還需要查看其中的引用。其中還有很多內容我沒有涉及。
建立一個簡單的函數,不使用
exec()
#在這個範例notebook中,可以看到如何以程式設計方式建立一個
.py
檔案。通常情況下,你可以透過手動儲存文字來在文字編輯器中建立這樣的文件,例如將以下內容儲存為plot_func.py
:然後導入並運行它。在這個過程中,也會儲存一個影像檔。在notebook中,該圖片檔案
my_plot_via_func.png
會被顯示出來。這只是一個簡單的版本。導入和執行函數的過程在純Python中的終端或其他地方也可以工作,直到顯示圖像檔案。如果你以圖形物件(圖形)的形式傳回繪圖結果,你需要一種顯示的方式。在Jupyter中可以工作,但在純Python中不行。
我添加了這個部分,因為我仍然不清楚你想要做什麼。我還有一個更高級的版本,可以使用特殊組織的Pandas資料幀來產生專門的繪圖。要嘗試,請點擊這裡,然後點擊
launch binder
,並按照會話開始時出現的範例notebook進行操作。也許這能幫助你更好地表達你的需求。特別是因為它將類似於這個繪圖腳本中的所有硬編碼的東西泛化,使其成為一個可以呼叫的命令列腳本或函數。你將看到我在下面的評論中所說的必要基礎設施。命令列腳本也可以在純Python中運行。你會看到我在notebook中通常使用%run
,因為它更全面;然而,在notebook中,如果你可以犧牲更好的輸出處理並且不需要在notebook命名空間中運行腳本,那你通常可以將!python
替換為%run
,就像%run -i
允許的那樣。關於使用matplotlib繪圖產生傳回特定繪圖的程式碼的範例,可以參考這裡。
產生HTML
原始問題是關於HTML的,我在這個主要範例notebook的底部添加了一個產生HTML的部分,這是對第一個評論的回應。實際上,這篇文章「將matplotlib圖形嵌入iPython HTML」可能已經涵蓋了原始問題的大部分內容?