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
コード
コードは以下の通り。