!cd
と %cd
の違いは?
Jupyter Notebookでは!ls
!cd
のようなシェルコマンドや,%time
%run
などのマジックコマンドが利用できます.
Notebook上でディレクトリを移動する場合,シェルコマンド!cd
を使いたくなりますが,なぜかマジックコマンドにも%cd
が存在しています.この違いは何でしょうか?
結論から言うと,
-
%cd
を使うとPythonの作業ディレクトリを変更できる. -
!cd
を使うと新しいシェル内でcd
を実行し,そのシェルは終了する.
つまりPythonの作業ディレクトリを変えたいときは!cd
ではなく%cd
を使います.
実際に試してみる
簡単に動作を確認してみます.個人的にGoogle Colabをよく使うので以下はGoogle Colab上で実行していますが,他のNotebook環境でも同じはずです.
Google Colabでは,起動時のディレクトリは/content
で,そこにはsample_data
というディレクトリが入っています.今は関係ありませんが,sample_data
ディレクトリにはサンプルデータがいろいろ用意されています.
/content/sample_data
内で作業するために,cd
を使ってここに移動したいという状況を仮定します.
まず!cd
でsample_data
に移動してみます.
!cd
でsample_data
に移動しているつもりですが(3),!pwd
の出力を見ると移動できていないことがわかります(4).一応Pythonで確認してみますが,やはり移動できていません.
!cd
を実行すると,今Pythonを実行しているシェルとは別に新しいシェルを作り,その中でcd
を実行します.新しいシェルでいくらディレクトリを移動しても,今Pythonを実行しているシェルには反映されません.これがディレクトリを移動できない原因です.
参考:
次に%cd
でsample_data
に移動してみます.
こちらは問題なくディレクトリを移動できています.
さいごに
とりあえずNotebookでcd
を使いたいときは%cd
を使っておけば良さそうです.
というかPython Data Science Handbookにはっきりそう書いてありますね…
一度読んだことがあるはずなのに完全に忘れていました.