よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【Windows10】JupyterNotebookでスニペットを使えるようにする方法1

Windows10のJupyterNotebookでスニペットを使えるようにする記録。



【目次】




【実行環境】


Windows10
Anaconda
JupyterNotebook
Python3.7
コマンドプロンプト



スニペットSnippetとは?】


スニペットとは英語でSnippetと書き、「断片」や「切れ端」という意味だそうです。
プログラミング用語ではコードの切り貼りができるテクニックのようなものを指しているようですが、定型文を呼び出せるツールを想像したら判り易いかと思います。
文章による定型文の替わりにプログラミングコードをスニペットとして登録しておいて、キーワードを入力すると瞬時に自動補完でコードがレンダリングされる。置き換わるわけです。
それにより素早いコーディングや文章生成が可能となる。YouTubeなどでそれを使った「10分でWebサービスを作る!」みたいな実演されてたりします。 画面上に次々とコードが出現して、あっという間に形作られる。魔法のようです。



【JupyterNotebookでスニペットを使えるようにする】


JupyterNotebook専用の拡張機能を使ってスニペットを使えるようにします。
まずは拡張機能のファイルをインターネットからダウンロードしインストールします。

拡張機能jupyter_contrib_nbextensionsのダウンロードとインストール


コマンドプロンプト(その他ターミナル)から次のコマンドを実行します。

pip install jupyter_contrib_nbextensions


21MBほどのサイズでした。Successfully built なんちゃらかんちゃら と出たらOK。


そしたら次のコマンドを実行。

jupyter contrib nbextension install --user

これで拡張機能のインストールは完了。



◆JupyterNotebook起動


JupyterNotebookを起動します。開いてる人は閉じて再起動。


jupyter notebook

このコマンドでJupyterNotebookが起動します。



◆Nbextensionsタブで拡張機能のON/OFF設定


jupyter contrib nbextensionのインストールが済み、JupyterNotebookを起動すると画面に「Nbextensions」というタブが追加されます。

f:id:chayarokurokuro:20191102014135j:plain



「Nbextensions」タブをクリックした画面

f:id:chayarokurokuro:20191102014208j:plain



Configurable nbextensionsの下のチェックを外す
チェック disable configuration for nbextensions without 云々は、拡張機能全部「無効」にするチェック。
デフォルトで全て無効になっている。
「ONにし過ぎるとnotebookの環境を壊すかもしれんばってん、役に立つばい」と書いてある。



一覧にある一つ一つが拡張機能で、チェックを入れれば使えるようになる。
チェックするとその下に拡張機能名や使い方などが表示される。



◆2種類あるスニペット拡張機能


一覧に「Snippets」「Snippets Menu」の2つがあります。
微妙に違いますが、今回は「Snippets」を見ていきます。



◆Snippets(ドロップダウン)の設定


★ Snippets(ドロップダウン)の説明

スニペットが貼り付けられたセルが新規作成される。
「Snippets Menu」とは別物です。注意。

SnippetsをONにするとNotebookにドロップダウンメニューが出現します。

  1. NbextensionsタブでSnippetsをONにしたら一番左の「Files」タブをクリック。
  2. 適当なipynbファイルNew新規ipynbを作成。ブラウザの新しいタブが開く。
  3. JupyterNotebookのToolbar(保存アイコンなどが並んでる所)の一番右に「Snippets」ドロップダウンメニューが追加されている。

f:id:chayarokurokuro:20191102014236j:plain



f:id:chayarokurokuro:20191102014302j:plain



★ Snippets(ドロップダウン)の使い方


ドロップダウンメニューのどれかをクリックすると選択中のセルの上側にスニペットが貼り付けられた新規セルができる。
codeセルのみっぽい。Markdownセルなどにしたければ、貼り付けた後に変更する方法しかない?



★ Snippets(ドロップダウン)のスニペット登録方法


スニペットの新規追加方法
追加方法は「Nbextensionsタブ」のConfigurable nbextensionsでSnippetsにチェックを入れた際にその下に表示された中にあるAdding new snippetsに書いてあります。

$(jupyter --data-dir)/nbextensions/snippets/snippets.jsonというJSON形式のファイルを書き換えてスニペットを登録する。
パスを取得するために次のコマンドをターミナルから実行します。

jupyter --data-dir


我がPCは「C:\Users\ユーザー名\AppData\Roaming\jupyterに入っている」とおっしゃっております。
注)ユーザー名は実際のユーザー名が入っています。

残りのパスnbextensions\snippets\snippets.jsonをつなげてパス指定し、JSONファイルの中身を見てみます。

!type C:\\Users\\ユーザー名\\AppData\\Roaming\\jupyter\\nbextensions\\snippets\\snippets.json
{
    "snippets" : [
        {
            "name" : "example",
            "code" : [
                "# This is an example snippet!",
                "# To create your own, add a new snippet block to the",
                "# snippets.json file in your jupyter nbextensions directory:",
                "# /nbextensions/snippets/snippets.json",
                "import this"
            ]
        }
    ]
}



キー「"snippets"」と対応するバリューがリストになってます。
そのリストの中には{"name" : "example", "code" : #の並んだ文字列要素のリスト}で辞書が入ってます。
exampleスニペット名で、codeスニペットの内容のようです。

キー バリュー 注意
snippets 項目名? 変更するとスニペットが読まれなくなる。snippetsのままで。
name スニペット名 str型 適当に。
code スニペット内容 list型 1行ずつダブルクオートで囲み、行をカンマ区切りでリスト化する。



従って自作スニペットを追加するには、"snippets"のvalueになっているリスト内にスニペットを定義した辞書をリスト要素として追加すれば良さそうです。



snippets.jsonデータの手動書き換え


元々のデータ↓


{
    "snippets" : [
        {
            "name" : "example",
            "code" : [
                "# This is an example snippet!",
                "# To create your own, add a new snippet block to the",
                "# snippets.json file in your jupyter nbextensions directory:",
                "# /nbextensions/snippets/snippets.json",
                "import this"
            ]
        }
    ]
}




新規データ↓


{
    "name" : "contents",
    "code" : [
        "<br><br>",
        "# 目次",
        "---",
        "[:contents]",
        "<br><br>",
        "# 実行環境",
        "---",
        "Windows10<br>",
        "Anaconda<br>",
        "JupyterNotebook<br>",
        "Python3.7"
    ]
}




上の2つを手動のコピペで追加したのが ↓


{
    "snippets" : [
        {
            "name" : "example",
            "code" : [
                "# This is an example snippet!",
                "# To create your own, add a new snippet block to the",
                "# snippets.json file in your jupyter nbextensions directory:",
                "# /nbextensions/snippets/snippets.json",
                "import this"
            ]
        },
        
        {
            "name" : "contents",
            "code" : [
                "<br><br>",
                "# 目次",
                "---",
                "[:contents]",
                "<br><br>",
                "# 実行環境",
                "---",
                "Windows10<br>",
                "Anaconda<br>",
                "JupyterNotebook<br>",
                "Python3.7"
            ]
        }
    ]
}



ぶっちゃけ面倒くさい。



snippets.jsonPythonで上書き


手動でコピペしたが書き換えは次のPythonコードで行った。

import json

# snippets.jsonを手動のコピペで書き換えたデータ
snippets="""

{
    "snippets" : [
        {
            "name" : "example",
            "code" : [
                "# This is an example snippet!",
                "# To create your own, add a new snippet block to the",
                "# snippets.json file in your jupyter nbextensions directory:",
                "# /nbextensions/snippets/snippets.json",
                "import this"
            ]
        },
        
        {
            "name" : "contents",
            "code" : [
                "<br><br>",
                "# 目次",
                "---",
                "[:contents]",
                "<br><br>",
                "# 実行環境",
                "---",
                "Windows10<br>",
                "Anaconda<br>",
                "JupyterNotebook<br>",
                "Python3.7"
            ]
        }
    ]
}
"""

# snippets.jsonのパス
file = "C:\\Users\\我がPCのユーザー名\\AppData\\Roaming\\jupyter\\nbextensions\\snippets\\snippets.json"

# 上書き保存
with open(file, "w", encoding='utf8') as f:
    write = f.write(snippets)

スニペット追加登録したら、タブを開き直すと書き換えが反映される



作ったスニペットを貼り付けたのが↓


<br><br>
# 目次
---
[:contents]
<br><br>
# 実行環境
---
Windows10<br>
Anaconda<br>
JupyterNotebook<br>
Python3.7



ついでなのでsnippets.jsonPythonで読み込んでみる

import json

file = "C:\\Users\\我がPCのユーザー名\\AppData\\Roaming\\jupyter\\nbextensions\\snippets\\snippets.json"

with open(file, "r", encoding='utf8') as f:
    read = f.read()
    sni = json.loads(read) #snippetsの中身 dict型
    sni_value = sni["snippets"]  #snippetsのvalue list型   
    
    print("【snippets.jsonの中身】\n\n", sni)
    print("\n\n")
    
    print("【snippets.jsonの中身】\n\n", sni_value)
【snippets.jsonの中身】

 {'snippets': [{'name': 'example', 'code': ['# This is an example snippet!', '# To create your own, add a new snippet block to the', '# snippets.json file in your jupyter nbextensions directory:', '# /nbextensions/snippets/snippets.json', 'import this']}, {'name': 'contents', 'code': ['<br><br>', '# 目次', '---', '[:contents]', '<br><br>', '# 実行環境', '---', 'Windows10<br>', 'Anaconda<br>', 'JupyterNotebook<br>', 'Python3.7']}]}



【snippets.jsonの中身】

 [{'name': 'example', 'code': ['# This is an example snippet!', '# To create your own, add a new snippet block to the', '# snippets.json file in your jupyter nbextensions directory:', '# /nbextensions/snippets/snippets.json', 'import this']}, {'name': 'contents', 'code': ['<br><br>', '# 目次', '---', '[:contents]', '<br><br>', '# 実行環境', '---', 'Windows10<br>', 'Anaconda<br>', 'JupyterNotebook<br>', 'Python3.7']}]



おわりに


いろいろやってたら長くなってしまった。
JSONファイルを手書きで書き直してスニペットを新規登録するのが面倒なのでどうにかしたい。
スニペット新規登録用スニペットを作って、セルに貼り付けて実行すればもう少し楽になるかな。

今回は以上です。