Jupyterのカーネルはどうすれば作れる?
- Jupyterのカーネルを作ってみたい。
- でもどうしたらいいかわからない。
という方がいらっしゃるのではないかと思います。
ここではそこから前に進むために,最も簡単なカーネル(ラッパーカーネルと呼ばれるもの)の作成例を示します。
(https://jupyter-client.readthedocs.io/en/stable/wrapperkernels.html のまんまではあるのですが環境構築が初めての人にはわからないかと思い。)
ラッパーカーネルとは何かとかすっ飛ばしてとにかく動作例を体感しようという趣旨な感じです。
まずは環境準備
ほとんどの方がcondaを使って開発に必要なpackageをインストールしているかと思います。
ここでもcondaでラッパーカーネル作成のための環境を作ります。
prompt_toolkitのバージョンとJupyterコンソールの相性があるのでcondaを使っといた方が無難っぽいです。
とりあえずjupyterのコンソールが要ります。前述の相性がありますんでバージョンに気をつけてください。
conda install jupyter_console=6.0.0
次に名付けるカーネル名でフォルダー(ディレクトリ)を作ります。
ここではecho
としてます。
mkdir echo
echo
フォルダーの下に下記のechokernel.py
とkernel.json
を作ります。
https://jupyter-client.readthedocs.io/en/stable/wrapperkernels.html のまんまです。
from ipykernel.kernelbase import Kernel
class EchoKernel(Kernel):
implementation = 'Echo'
implementation_version = '1.0'
language = 'no-op'
language_version = '0.1'
language_info = {
'name': 'Any text',
'mimetype': 'text/plain',
'file_extension': '.txt',
}
banner = "Echo kernel - as useful as a parrot"
def do_execute(self, code, silent, store_history=True, user_expressions=None,
allow_stdin=False):
if not silent:
stream_content = {'name': 'stdout', 'text': code}
self.send_response(self.iopub_socket, 'stream', stream_content)
return {'status': 'ok',
# The base class increments the execution count
'execution_count': self.execution_count,
'payload': [],
'user_expressions': {},
}
if __name__ == '__main__':
from ipykernel.kernelapp import IPKernelApp
IPKernelApp.launch_instance(kernel_class=EchoKernel)
{"argv":["python","-m","echokernel", "-f", "{connection_file}"],
"display_name":"Echo"
}
これで環境準備というかファイル作成は終わりです。
カーネルをインストールし,動作を確認しよう
それではカーネルをインストールしてみましょう。
jupyter kernelspec install さっきのカーネル名フォルダーのパス(==echokernel.py, kernel.jsonがあるところ。相対パスでOKです)
これでインストールができるはずです。
ではいよいよカーネルの動作確認を行います。
cd さっきのカーネル名フォルダーのパス(==echokernel.py, kernel.jsonがあるところ)
jupyter console --kernel echo
すると
打った文字が出力されるだけのREPLが得られるかと思います。
これで一通りJupyterのカーネルを自分で作り,動かせたことになります。
この先は?
pexpectというPythonパッケージを使用してttyでREPLを制御できる言語(例えばRuby)のラッパーカーネルを作れたりするようです。
余裕があれば残りのjupyter notebook Advent Calendar 2019でそのあたりもやってみようと思います。
以上。