jupyter nbconvert

jupyter のノートブックからHTMLやPDFを nbconvert で生成することができる。 しかし、多くの場合はすべてのセルを表示したいわけではないので、セル単位で 出力を抑制する必要がある。これにはいくつか方法がある。

TagRemovePreprocessor

nbconvert には preprocessor という概念がある。 この内の、TagRemovePreprocessorを使うと、特定のタグがついたセルの出力を抑制できる。そもそも「タグ」というのは何なのか知らなかったのだけど、セルごとに任意の属性を付加する事ができる仕掛けで、普通のJupyter notebookでもできるし、vscodeでもつけることができる。ただし結構使いづらい。 これを使うと、

jupyter nbconvert --to html --TagRemovePreprocessor.remove_input_tags='{"hide"}' test.ipynb

のようにして、入力セルだけを抑制できる。ここで hide としているのは任意のタグなので、適当に変更することができる。なんで波括弧が要るのか、よくわからない。
remove_input_tags を remove_cell_tagsもしくはremove_output_tags にすると、それぞれ入出力両方、出力セルのみの出力を抑制できる。

タグは柔軟で素晴らしいのだけど、タグを付けるのが結構面倒だし、タグをvscodeなどで目視で確認する事ができない。

RegexRemovePreprocessor

RegexRemovePreprocessor というものがあり、これはセルの内容に対して、正規表現で検索を行って、マッチしたら出力を抑制してくれる。例えば冒頭のコメントに# hide と書いてあったら出さない、などということができる。

jupyter nbconvert --RegexRemovePreprocessor.patterns="['^# hide']" test.ipynb

素晴らしい、がこれはセルをまるごと抑制してしまい、入力だけを抑制することはできない。 ソースコードは site-packages/nbconvert/preprocessors にあるのだけど、非常に単純なコードで全く対応する気がなさそう。ほんのちょっといじればできそうなんだけどなあ。。

MyRegexRemovePreprocessor

ということでいじってみた。素晴らしいことに、nbconvertにはさまざまなモジュールを外部からあたえる仕掛けが用意してあり、もとのソースコードに手を入れなくても独自のpreprocessorを入れる事ができるのだった。

jupyter nbconvert '--Exporter.preprocessors=["クラス名"]' --クラス名.オプション名=オプション値 ..

のように、クラス名とオプション値を指定する。

せっかくなので、各セルの入力部分の抑制、出力部分の抑制、全体の抑制を独立してコントロールできるようにした。オプション名は以下の通り。

all セル全体を抑制

input 入力部分だけ抑制

output 出力部分だけを抑制

下のコードをregexremove.py という名前でセーブして、PYTHONPATHの通った場所において、

jupyter nbconvert '--Exporter.preprocessors=["regexremove.MyRegexRemovePreprocessor"]' \
 --MyRegexRemovePreprocessor.input="['^# hide']"\
  formattest.ipynb

とやると、# hide を含む入力セルだけを変換対象から外すことができる。

input, output, all はすべて独立なので、次のように別のタグをそれぞれ指定することもできる。

jupyter nbconvert --Exporter.preprocessors=regexremove.MyRegexRemovePreprocessor \
 '--MyRegexRemovePreprocessor.input=^# hideinput'\
 '--MyRegexRemovePreprocessor.output=^# hideoutput'\
 '--MyRegexRemovePreprocessor.all=^# hideall'\
  formattest.ipynb

コード

コードは以下の通り。

 

广告
将在 10 秒后关闭
bannerAds