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でそのあたりもやってみようと思います。

以上。

广告
将在 10 秒后关闭
bannerAds