Python – Jupyter Notebookでシェルコマンド実行
標準のPythonインタープリタと対話するときに直面する不満の1つは、Pythonツールとシステムのシェルを両方操作するために複数のウィンドウを切り替えなければならない点です。
特にAWS Sagemakerを使用する際には、install pathが少し複雑だったりします。そんな時に、jupyter上でモジュールインストールやアップデートなどを行う機会が時々あります。
IPythonとシェルコマンド
IPythonはこのギャップを埋めるために、IPythonセッションから直接シェルコマンドを実行するための構文を提供します。感嘆符に秘密があります。入力行で!の後ろに書かれたものはPythonカーネルではなく、システムのシェルによって実行されます。以下の説明は、LinuxやmacOSなどUNIX系のシステムを使用していることを前提とします。ただし、デフォルトで異なるタイプのシェルを使用するWindowsでは、例のいくつかは失敗します。
IPythonからのシェルコマンド実行
コマンドラインで動作するすべてのコマンドは!を前置することでIPythonから実行できます。例えば、ls、pwd、echoコマンドは次のように実行できます。
contents = !ls
contents
---
['Untitled.ipynb']
directory = !pwd
directory
---
['/Users/xxx/xxx/xxx']
これらの結果はリストとして返されるのではなく、IPythonの定義する特殊なシェルの戻り値を表す型として返されることに注意してください。
type(directory)
---
IPython.utils.text.SList
これはPythonのリストとよく似ていますが、grepやfieldsメソッド、s、n、pプロパティなどの追加機能があり、検索、フィルタリング、および結果の表示で有用です。これらの詳細については、IPythonの組み込みヘルプを参照してください。
シェルに関連するMagicコマンド
IPythonからシェルコマンドを使うと、ファイルシステムを移動するのに!cdコマンドが使えないことに気付くでしょう。
!pwd
---
['/Users/xxx/xxx/xxx']
!cd
---
IPythonから実行されるシェルコマンドが、一時的なサブシェルで実行されるのが原因です。作業ディレクトリを永続的に変更する場合は、%cd Magicコマンドを使います。
%cd ..
---
/Users/xxx
実際には、%記号なしでも実行可能です。これはautomagic機能と呼ばれ、Magicコマンド%automagicでこの動作を切り替えることができます。
%cdの他に%cat、%cp、%env、%ls、%man、%mkdir、%more、%mv、%pwd、%rm、%rmdirなどが対象で、automagic機能が有効になっていれば%記号なしで使用できます。これにより、IPythonのプロンプトを、通常のシェルのように使うことができます。
まとめ
今回は、Python – Jupyter Notebookでシェルコマンド実行についてでした。Pythonセッションと同じ端末ウィンドウからシェルコマンドを実行できることにより、Pythonコードを書く際のインタープリタとシェルの間での切り替えは大幅に少なくなります。