ipythonノートブックでROOTファイルを操作しようとしています(ここのROOTは、Pythonインターフェースを備えたCERNのROOTデータ分析プログラムです)。ROOT の厄介な機能の 1 つは、多くの場合、出力を文字列として返すのではなく、stdout に直接送信することです。この出力を結果として ipython ノートブックに表示するために、次のように少し書きましたcell_magic
。
- ROOT に stdout をファイルにリダイレクトするように指示します。
- セルで python コマンドを実行します
- ROOT の出力リダイレクトをオフにします
- ファイルを読み取り、内容を出力します
これが私の小さなセルマジックコードです
import tempfile
import ROOT
from IPython.core.magic import register_cell_magic
@register_cell_magic
def rootprint(line, cell):
"""Capture Root stdout output and print in ipython notebook."""
with tempfile.NamedTemporaryFile() as tmpFile:
ROOT.gSystem.RedirectOutput(tmpFile.name, "w")
exec cell
ROOT.gROOT.ProcessLine("gSystem->RedirectOutput(0);")
print tmpFile.read()
このコードを ipython ノートブック セルに入れて実行すると、うまくいきます。例えば、
In [53]: f = ROOT.TFile('myRootFile.root') # Load the Root file
In [54]: %%rootprint
f.ls() # Show the contents of the ROOT file
... f.ls() output appears here - yay! ...
通常、 の出力はf.ls()
stdout に送られ、セルの結果として表示されません。しかし、このセル マジックを使用すると、出力がセルの結果に表示されます。それは素晴らしいです!
しかし、セル マジック コードをモジュールに入れると、機能しません。たとえば、上記のコードをノートブックに入れipythonRoot.py
、実行します。import ipythonRoot.py
上記のセルを実行しようとすると、定義されていない%%rootprint
というエラーが表示されます。行を にf
変更しようとしましたが、それは役に立ちませんでした。exec
exec cell in globals()
これを行う方法はありますか?また、cell_magic
関数を記述するためのより良い方法はありますか (たとえば、印刷する代わりに出力を返す必要があります)。助けてくれてありがとう!