LoginSignup
1
1

More than 1 year has passed since last update.

Jupyter nbconvert でセルの出力を抑制

Last updated at Posted at 2023-01-05

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_tagsremove_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

コード

コードは以下の通り。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1