IPythonマジックコマンドを作る

 IPythonマジックコマンドを作る

Jupyter Notebookは、インタラクティブにPythonなどのプログラムを実行する環境として人気があります。 Jupyter Notebookで拡張機能を作る方法としてはnbextensionsがありますが、作りたいものによっては作成方法が若干複雑です。 そこで、nbextensionsではなくIPythonのマジックコマンドを使って便利ツールを簡単に作る方法を紹介します。

B74ae56d7910fbe1dd685c999b8f9e31?s=128

ShibaNyan

March 29, 2020
Tweet

Transcript

  1. IPython マジックコマンドを作る @shiba6v

  2. IPython,Jupyter Notebookとは IPython: Pythonのインタラクティブな 実行環境. (Rubyで言うところのpry) Jupyter Notebookは,ブラウザで Pythonを書けるIPythonベースの実 行環境.(右図)

    セル単位で実行
  3. IPythonマジックコマンドを使ってみる 1行追加するだけで,便利機能が使える! 例: 実行時間の計測 この一行を追加

  4. 目次 - マジックコマンドは何をしているのか - マジックコマンドでできること - マジックコマンドを作る - 今回の題材: import文の整理

    - 何もしないマジックコマンド - ライブラリの関数を持ってくる - その他の実装例 - マジックコマンドの使いどころ - Nbextensionsとの比較
  5. マジックコマンドは何をしているのか セル内のソースコード (文字列) 1. バイトコードに変 換 2. 時間計測開始 3. 実行

    4. 時間計測終了 https://github.com/ipython/ipython/blob/master/IPython/core/magics/execution.py#L1184 実行にかかった時 間を出力 %%time の例
  6. マジックコマンドは何をしているのか セル内のソースコード (文字列) https://github.com/ipython/ipython/blob/master/IPython/core/magics/execution.py#L1184 %%time の例 ソースコードを使って,好きな処理をできる 1. バイトコードに変 換

    2. 時間計測開始 3. 実行 4. 時間計測終了 実行にかかった時 間を出力
  7. マジックコマンドでできること Pythonでできることは,マジックコマンドにできる.. ・時間を計測 ・time (Python), %%time (マジックコマンド) ・実行時プロファイルを取得 ・cProfile (Python),

    %%prun (マジックコマンド) ・変数をシリアライズして保存 ・pickle (Python), %store (マジックコマンド)
  8. IPythonのマジックコマンドを作る Pythonの便利ツールをマジックコマンドとして使えるように実装する. 便利ツールが1行で使えると,開発が捗る!

  9. 今回の題材 import文 グチャグチャになりがち問題

  10. 今回の題材 import文 グチャグチャになりがち問題 同じモジュールを何回もimport

  11. 今回の題材 import文 グチャグチャになりがち問題 同じモジュールなのに別の場所で importしている

  12. 今回の題材 import文 グチャグチャになりがち問題 自作モジュールをライブラリ と区別したい.

  13. import文を整理するPythonツール isort https://github.com/timothycrosley/isort $ isort src.py

  14. import文を整理するPythonツール isort Jupyter Notebookでもやりたい! https://github.com/timothycrosley/isort $ isort src.py

  15. マジックコマンド %%isort を作る Jupyter Notebookでも同じようなツールが欲しい・・・ こんな感じで・・・

  16. 何もしないマジックコマンド 何もしないで出力してみる

  17. 何もしないマジックコマンド 何もしないで出力してみる

  18. 何もしないマジックコマンド 何もしないで出力してみる

  19. ライブラリの関数を持ってくる $ isort src.py isort.main:main を呼んでいるこ とがわかる

  20. ライブラリの関数を持ってくる $ isort src.py

  21. マジックコマンド %%isort を作る できた!

  22. マジックコマンド %%isort を作る ちょっとリッチな出力も できる.

  23. マジックコマンド %%isort を作る Pythonスクリプトとして書いて ,importすればきれいに!

  24. マジックコマンド %%isort を作る 作り方説明 終わり

  25. その他の実装例 shape_commentator 行列の次元をコメントとして 付けてくれる (自作ツール) 内部的にはASTをいじって 実行している. https://github.com/shiba6v/shape_commentator

  26. その他の実装例 mypy Pythonで 静的型チェック https://github.com/shiba6v/mypy_ipython

  27. マジックコマンドの使いどころ なぜマジックコマンドを作りたかったか? .pyファイルにしか適用できない便利ツールをJupyterでも使いたい!

  28. マジックコマンドの使いどころ マジックコマンドの悪い点 Pythonファイルに変換した時に, 読みづらくIPython環境なしでは実行できない $ jupyter nbconvert --to script src.ipynb

  29. Nbextensionsとの比較 Nbextensions: Jupyter Notebookの拡張機能 (公式) JavaScriptで作る.

  30. Nbextensionsとの比較 IPythonマジックコマンド Nbextensions 主に使う言語 Python JavaScript

  31. Nbextensionsとの比較 IPythonマジックコマンド Nbextensions 主に使う言語 Python JavaScript Jupyter Notebookの JavaScript APIを使う

    × (できなくはないが非常にや りづらい) ◯
  32. Nbextensionsとの比較 IPythonマジックコマンド Nbextensions 主に使う言語 Python JavaScript Jupyter Notebookの JavaScript APIを使う

    × (できなくはないが非常にや りづらい) ◯ 作りやすさ ◯ (物によっては数行) △ (インストール・エスケープ 処理したりといった手間 )
  33. Nbextensionsとの比較 IPythonマジックコマンド Nbextensions 主に使う言語 Python JavaScript Jupyter Notebookの JavaScript APIを使う

    × (できなくはないが非常にや りづらい) ◯ 作りやすさ ◯ (物によっては数行) △ (インストール・エスケープ 処理したりといった手間 ) 他のIPythonフロントエンド (IPython, Jupyter Lab, VSCodeなど) でも動く ◯ (JavaScriptでJupyter NotebookのAPIを使わなけ れば大丈夫) ×
  34. マジックコマンドで開発を加速させよう

  35. おわり - マジックコマンドは何をしているのか - マジックコマンドでできること - マジックコマンドを作る - 今回の題材: import文の整理

    - 何もしないマジックコマンド - ライブラリの関数を持ってくる - その他の実装例 - マジックコマンドの使いどころ - Nbextensionsとの比較