よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【JupyterNotebook】マジックコマンド使用法基礎

おわび


このページを開くと「こんにちは」と出たと思いますが、記事の中にJavaScriptを動かすマジックコマンドを書いている為に出たものです。先におわび申し上げます。



はじめに


Jupyter Notebookにはmagic commandという機能がついています。

便利そうですのでちょっと触ってみてどういうものなのか書こうとおもいます。

タイトル基礎なんて銘打ってますが、コンピューティングの基礎がまるでわかってないので察してくださいませ( ^∀^)



目次




作業環境


  • Androidスマホ
  • QPyNotebook
  • Pydroid3のJupyterNotebook  

    magic commandとは?


IPython公式
Built-in magic commands — IPython 7.8.0 documentation
によると、 IPython(やJupyter Notebook)についている機能で、IPythonのカーネルによって実装・提供されている。


使い方としてはコードセル%%%の後に続けて特定のコマンドを記入し、セルを実行するとそのコマンドが実行できる。



わざわざターミナルを立ち上げなくてもセル上でコマンドが実行できるという所が便利



使えるマジックコマンド一覧の表示方法


星の数ほどあるコマンドを無限に使えるわけではなさそう。(でも拡張機能があるみたい。ここでは触れない)
マジックコマンドはIPythonカーネルに組み込んであり、それに依存しています。なるほど。
何のコマンドが使えるのかな?
一覧を表示するマジックコマンドが次。


セルをCodeタイプにして、↓の文字列を書いて、QPyNotebookでセルを実行してみます。

%lsmagic
Available line magics:
%alias  %alias_magic  %autocall  %automagic  %autosave  %bookmark  %cat  %cd  %clear  %colors  %config  %connect_info  %cp  %debug  %dhist  %dirs  %doctest_mode  %ed  %edit  %env  %gui  %hist  %history  %killbgscripts  %ldir  %less  %lf  %lk  %ll  %load  %load_ext  %loadpy  %logoff  %logon  %logstart  %logstate  %logstop  %ls  %lsmagic  %lx  %macro  %magic  %man  %matplotlib  %mkdir  %more  %mv  %notebook  %page  %pastebin  %pdb  %pdef  %pdoc  %pfile  %pinfo  %pinfo2  %popd  %pprint  %precision  %profile  %prun  %psearch  %psource  %pushd  %pwd  %pycat  %pylab  %qtconsole  %quickref  %recall  %rehashx  %reload_ext  %rep  %rerun  %reset  %reset_selective  %rm  %rmdir  %run  %save  %sc  %set_env  %store  %sx  %system  %tb  %time  %timeit  %unalias  %unload_ext  %who  %who_ls  %whos  %xdel  %xmode

Available cell magics:
%%!  %%HTML  %%SVG  %%bash  %%capture  %%debug  %%file  %%html  %%javascript  %%js  %%latex  %%markdown  %%perl  %%prun  %%pypy  %%python  %%python2  %%python3  %%ruby  %%script  %%sh  %%svg  %%sx  %%system  %%time  %%timeit  %%writefile

Automagic is ON, % prefix IS NOT needed for line magics.

一覧が表示されました。

大きく別けて、

  • Available line magicsという%が一つ付いたもの
  • %%Available cell magics


があるようです。



試しに、次は同じものをPydroid3のjupyter notebookで実行。

%lsmagic
Available line magics:
%alias  %alias_magic  %autoawait  %autocall  %automagic  %autosave  %bookmark  %cat  %cd  %clear  %colors  %conda  %config  %connect_info  %cp  %debug  %dhist  %dirs  %doctest_mode  %ed  %edit  %env  %gui  %hist  %history  %killbgscripts  %ldir  %less  %lf  %lk  %ll  %load  %load_ext  %loadpy  %logoff  %logon  %logstart  %logstate  %logstop  %ls  %lsmagic  %lx  %macro  %magic  %man  %matplotlib  %mkdir  %more  %mv  %notebook  %page  %pastebin  %pdb  %pdef  %pdoc  %pfile  %pinfo  %pinfo2  %pip  %popd  %pprint  %precision  %prun  %psearch  %psource  %pushd  %pwd  %pycat  %pylab  %qtconsole  %quickref  %recall  %rehashx  %reload_ext  %rep  %rerun  %reset  %reset_selective  %rm  %rmdir  %run  %save  %sc  %set_env  %store  %sx  %system  %tb  %time  %timeit  %unalias  %unload_ext  %who  %who_ls  %whos  %xdel  %xmode

Available cell magics:
%%!  %%HTML  %%SVG  %%bash  %%capture  %%debug  %%file  %%html  %%javascript  %%js  %%latex  %%markdown  %%perl  %%prun  %%pypy  %%python  %%python2  %%python3  %%ruby  %%script  %%sh  %%svg  %%sx  %%system  %%time  %%timeit  %%writefile

Automagic is ON, % prefix IS NOT needed for line magics.

出力結果が若干違うっぽい。
環境によって使えるコマンドが変わる。「それぞれのIPythonカーネル固有のマジックコマンドに限定されている」と上に貼ったurlこちら ipythonにあります。
下のPydroid3の方はpipコマンドが使えるみたい。
セルで即座にモジュールのインストールができるんですかね。しゅごい…



%と%%の違い


%が一つのAvailable line magicsと、%%Available cell magicsは何が違うんだろう?



%line magicsは、コマンドを書いたその一行だけ魔法が発揮され、%%cell magicsはセル内の全ての行で魔法を発揮する。

使用法の表示 「?」


マジックコマンドの後に?を一つ付けると、そのマジックコマンドのdocstringが表示される。



docstringとは
関数やクラスの定義したあとの一行目からトリプルクォート"""で囲んで書かれた、関数やクラスの仕様や使用方法の説明書き。
初心者はこれをhelp()関数を使うなどして読んで勉強するのがいいんでしょうけど、如何せん全て英語でツラい…


docstringを書いておけば、Sphinx等のドキュメント自動生成ツールでPythonの公式ページやWikipediaみたいなのがサクッと出来上がるらしいのですが、如何せんドキュメントを書く程のプログラムを作る能力がないのと、面倒なのと…



docstringについて参照
[https://note.nkmk.me/python-docstring:embed]
[https://qiita.com/simonritchie/items/49e0813508cad4876b5a:embed]
[https://code-graffiti.com/docstring-in-python:embed]
[https://python.atelierkobato.com/help:embed]



話しを「?」に戻します。
マジックコマンド?でこのdocstringが表示できる。
やってみます。

%alias?

pydroid3のjupyter notebookで実行すると、Jupyter Pagerなるものが立ち上がり、ブラウザの別ページでdocstringが表示されました。

↓ 画面の写真

f:id:chayarokurokuro:20190917224645j:plain



ソースコード表示 ??


マジックコマンド??ソースコードが表示される。割愛。



Magic Commandを試す


いくつか使ってみる。



作業ディレクトリ確認のマジックコマンド


Linuxコマンドでカレントディレクトリを取得するにはターミナルでpwdと入力実行しますが、それと同じ。

%pwd
'/storage/emulated/0/qpython/notebooks'

QPyNotebookのデフォルトのディレクトリで作業中(*σ´ェ`)σ



フォルダ作成マジック


作業ディレクトリの中に新しくディレクトリを作成します。

%mkdir Magic_Command
mkdir: 'Magic_Command': File exists

2回実行したので「すでに存在している」と言われた。



移動マジックと作業ディレクトリ表示マジック


複数のマジックコマンドいけるか?
移動し、カレントディレクトリ表示。

%cd Magic_Command
%pwd
/storage/emulated/0/qpython/notebooks/Magic_Command





'/storage/emulated/0/qpython/notebooks/Magic_Command'

移動した時点で表示されました。



Pythonファイルの実行マジック


Pythonスクリプトを書いて保存し、マジックコマンドで実行してみる。

# Pythonのコード
janken_code = """

import random

lst = ["✊","✌️","✋"]
print(random.choice(lst))

"""

# 上のコードをファイルに新規保存
with open("janken.py","w") as f:
    f.write(janken_code)

# ディレクトリ内容物表示
%ls
janken.py

Pythonファイルが作成されている。


ファイルの中身を見てみます。

# janken.pyの中身を見る
%cat janken.py
import random

lst = ["✊","✌️","✋"]
print(random.choice(lst))

ちゃんと書かれています。


そしたら、ファイルを実行してみよう。

# Pythonファイルを実行
%run janken.py
✌️

↑ ターミナルを立ち上げなくともJupyterからファイルが実行できてしまう。
なんと便利なんだ!

ちなみに↑のコードは実行するたびに出力が変わります。



Jupyter Notebookのセルに書いたPythonのコードを、上のようにわざわざopen()関数で保存したりせずとも、コードセルを.pyファイル(julia、R、markdownなども可)で保存する超便利な方法があるようです。

(番外編)Jupytextモジュール


参考ページ。

[https://github.com/mwouts/jupytext:title]

日本語でインストールから使い方まで載せてあります。
[https://qiita.com/cfiken/items/8455383f32ee19dfbba3:title]



グラフ/イメージ表示


%matplotlib
Jupyter Notebookのマジックコマンドで最もポピュラーなのではなかろうか。知らんけど。
だいたい解説書とかで最初に出てくる。
棒グラフを表示させてみる。

%matplotlib inline

import matplotlib.pyplot as plt

members = ["A", "B", "C", "D", "E"]
x = range(5)
y = [81, 98, 42, 73, 54]

# 棒グラフを描画する
plt.bar(x, y, tick_label = members) 
plt.show()

f:id:chayarokurokuro:20190917220248j:plain



マジックコマンドの実行履歴


実行すると履歴を表示。

%history



(番外編)リダイレクトを試す


コマンドのリダイレクトを使って、出力結果をファイルに書き出せるか試す。

%catで先ほど作成保存したjanken.pyなるファイルを文字列で読み込み、リダイレクト>output.txtなるテキストファイルに書き出す。

%cat janken.py >output.txt

実行した。
できているか確める。

%ls
%cat output.txt 
janken.py output.txt 


import random

lst = ["✊","✌️","✋"]
print(random.choice(lst))

OK👌

%lsmagicをリダイレクトでファイルに書き出したいのだけど、この方法では上手くいかなかった。理由はわからない。

%%html


%%html
<script>
alert("こんにちは");
</script>

実行すると何か出る。



%%markdown


%%markdown
~~失言~~

失言



その他、参照


各々のマジックコマンドがどんなものなのかを、ざっと表にした。

具体的な使用法はIPythonのオフィシャルページで見てください。
https://ipython.readthedocs.io/en/stable/interactive/magics.html

マジック
コマンド
動作
%alias コマンド名を
置き換える
%alias_magic マジックコマンドを
別名に置き換える
%autocall 括弧を付けずに関数の
呼び出しを可能にする
%automagic マジックコマンドを
%無しで呼び出せる設定
%autosave 自動保存の設定
%bookmark IPythonの
ブックマーク機能
%cat ファイルの読み取り
%cd ディレクトリの移動
%clear 画面のバッファをクリア
%colors プロンプト、情報システム
例外ハンドラーの配色を
切り替え
%config IPythonを構成システム
を表示
%connect_info IPythonとの接続データ
の取得
%cp コピー
%debug 対話型デバッガのオン
%dhist ディレクトリの
移動履歴
%dirs カレントディレクトリの
スタックを表示
%doctest_mode doctestモードの
オンオフ切り替え
%ed %editのエイリアス
ショートカット
%edit viかメモ帳のエディタ起動
でファイルを編集
%env 環境変数を表示
%gui IPython GUIのイベントループ
統合のオンオフ
%hist %historyのショートカット
%history マジックコマンドの
実行履歴
%killbgscripts %%script等により
開始された全ての
バックグラウンドプロセス
を強制終了
%ldir 特定の%lsのショートカット
%less 一画面ずつ表示
%lf 特定のlsコマンドの
ショートカット
%lk 上に同じ
%ll 上に同じ
%load フロントエンドにコードを
ロードする
%load_ext マジックコマンドの
拡張機能の読み取り
%loadpy 拡張機能の名前変更
%logoff ログ出力の停止
%logon ログ出力の再開
%logstart IPythonへの入力内容の
ログ出力を開始
%logstate ログ出力状況表示
%logstop IPythonへの入力内容の
ログ出力を停止
%ls ディレクトリの中身表示
%lsmagic 使えるマジックコマンド
一覧表示
%lx 特定のlsコマンドの
ショートカット
%macro 再実行の為のマクロを
定義する
%magic マジック関数システム
に関する情報を出力
%man コマンドのマニュアル表示
%matplotlib グラフやイメージの
表示設定
%mkdir ディレクトリの作成
%more 一画面ずつ表示
%mv ファイルやディレクトリの
名前変更や移動
%notebook IPython notebookを
エクスポート及び変換する
%page オブジェクトを綺麗に
プリントしページャー
表示する
%pastebin dpasyeの貼り付けビンに
コードをアップロードし
URLを返す
%pdb pdbインタラクティブ
デバッガの自動
呼び出しの制御
%pdef 呼び出し可能なオブジェクトの
呼び出し著名を出力する
%pdoc オブジェクトのdocstring
を表示
%pfile 対象オブジェクトの
ファイル内容表示
%pinfo 対象オブジェクトの
概要表示
%pinfo2 オブジェクトに関する追加の
詳細情報を提供する
%popd スタックの一番上の
ディレクトリに移動する
%pprint プリティプリントの
オンオフ
%precision プリティプリントの
浮動小数点精度を設定
%profile %prunにより使われるコードのプロファイル
%prun Pythonコードプロファイラー
ステートメントを実行
%psearch ワイルドカード名前空間
オブジェクトを検索
%psource オブジェクトの
ソースコード表示
%pushd 現在のディレクトリを
スタックに配置し
ディレクトリを変更する
%pwd カレントディレクトリ表示
%pycat 構文が強調されたファイル
を表示する
%pylab numpyとmatplotlibを
ロードしインタラクティブ
動作させる
%qtconsole GUIのqtconsole起動
%quickref マジックコマンドなどの
簡単なリファレンス表示
%recall コマンドを繰り返すか
編集入力行にコマンド取得
%rehashx $PATHの全ての実行可能
ファイルでエイリア
ステーブルを更新する
%reload_ext モジュール名でIPython
拡張機能をリロード
%rep %recallのショートカット
%rerun 直前のコマンドを再実行
%reset 宣言した変数を削除
%reset_selective 名前空間のリセット
%rm ファイルの削除
%rmdir ディレクトリの削除
%run ファイルの実行
%save 特定ファイルに一連の
行またはマクロを保存
%sc シェルの実行結果を
キャプチャ
%set_env 環境変数の設定
%store 保存された全ての変数を表示
%sx シェルコマンドを実行し
出力をキャプチャする
%system シェルコマンドを実行し
出力をキャプチャする
%tb トレースバックを
表示
%time 実行に掛かった
時間の測定
%timeit 実行時間の測定の
ベストタイムを表示
%unalias エイリアスを削除
%unload_ext モジュール名で拡張
機能をアンロードする
%who 宣言されている変数や
関数等の名前を表示
%who_ls 宣言されている変数や
関数等の名前を
リストで表示
%whos 宣言されている変数や
関数等の名前を一覧表示
%xdel 変数を削除し、IPythonが
参照している場所から
変数をクリアする
%xmode 例外ハンドラーのモード切替
%%! システムコマンド
(シェルコマンド)を実行
%%HTML セルをhtmlブロックとし
レンダリングする
%%SVG セルをSVGブロックとし
レンダリングする
%%bash サブプロセスでbash
使用してセルを実行
%%capture セルを実行し、stdout、
stderr及びIPythonの
display()呼び出しを
キャプチャする
%%debug 対話型デバッガ
%%file %writefileコマンドの
ショートカット
%%html セルをhtmlのブロックとし
レンダリングする
%%javascript JavaScriptのセルブロック
を実行する
%%js 上に同じ
%%latex セルをラテックスの
ブロックとしてレンダリングする
%%markdown セルをマークダウンの
ブロックとしてレンダリングする
%%perl サブプロセスでperl
使用して実行する
%%prun Pythonコードのプロファイラーで
ステートメントを実行する
%%pypy サブプロセスでpypyを
使用してセルを実行する
%%python サブプロセスでpython
使用してセルを実行する
%%python2 サブプロセスでpython2を
使用してセルを実行する
%%python3 サブプロセスでpython3を
使用してセルを実行する
%%ruby サブプロセスでruby
使用してセルを実行する
%%script シェルコマンドを使用して
セルを実行する
%%sh サブプロセスでshを使用して
セルを実行する
%%svg セルをSVGリテラルとして
レンダリングする
%%sx シェルコマンドを実行し
出力をキャプチャする
%%system 上に同じ
%%time 実行時間の測定
%%timeit 実行時間を数回測定し最小値を返す
%%writefile セルの内容をファイルに書き込む

表の一番したにある%%witefileなんて、すごく便利そうじゃない?
以上です。