2019年5月5日日曜日

IPythonのシェルコマンド実行が便利

あまり機能として使っていなかったが、コマンドラインで動作する全てのコマンドは、!のマークを前におくことでIPythonのコンソールから実行できる。
  # IPython
  !cd /Users/Me/wd/
  !ls -lh

これが地味に便利で感動している。これまでは、カーネルを変更してbashのコマンドを実行していたが、最近はpython3のカーネルのままで必要なコマンドを実行するようになった。インストールした解析用コマンドも、IPythonコンソールから動かずに実行することができるので楽だ。
シェルとの間で、値を受け渡す時は、代入演算子を利用する。
  # IPython
  !cd /current/data/dir/
  Values = !ls

逆に、python側で使っている変数をシェル側に渡す事もできて、その時は、{変数名}を使う。
  # IPython
  Val1 = 123549
  !echo {Val1}

  123549
注意点は、IPythonからシェルコマンドを使うときに、使用できないコマンドがある事。例えば、!cdとするとにホームディレクトリに移動することを期待するかもしれないが、実際にはディレクトリの移動はできていない。これを知らないと、例えば標準出力で保存したと思っていたファイルが、予期していたところとは別のディレクトリに保存されていたりする。最初わからなかったが、本を読むと、IPythonから実行されるシェルのコマンドは一時的なサブシェルで実行されることが原因らしい。こういったコマンドは、Magicコマンドとして実行する必要がある。マジックコマンドにするには、頭に%をつける。
  # IPython
  %cd /Path/To/My/data/
  
実際には、%をつけずに実行すると、automagic機能が働いて自動的にMagicコマンドに切り替えられるらしい。対象は、cat, cp, env, ls, mkdir, mv, pwd, rm, rmdirなど。