8
1

More than 1 year has passed since last update.

!cd と %cd の違い

Last updated at Posted at 2021-12-28

!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ディレクトリにはサンプルデータがいろいろ用意されています.
image.png
/content/sample_data内で作業するために,cdを使ってここに移動したいという状況を仮定します.

とりあえず現在のディレクトリとその中身を確認します.
image.png

まず!cdsample_dataに移動してみます.
image.png
!cdsample_dataに移動しているつもりですが(3),!pwdの出力を見ると移動できていないことがわかります(4).一応Pythonで確認してみますが,やはり移動できていません.

!cdを実行すると,今Pythonを実行しているシェルとは別に新しいシェルを作り,その中でcdを実行します.新しいシェルでいくらディレクトリを移動しても,今Pythonを実行しているシェルには反映されません.これがディレクトリを移動できない原因です.

参考:

次に%cdsample_dataに移動してみます.
image.png
こちらは問題なくディレクトリを移動できています.

さいごに

とりあえずNotebookでcdを使いたいときは%cdを使っておけば良さそうです.

というかPython Data Science Handbookにはっきりそう書いてありますね…
一度読んだことがあるはずなのに完全に忘れていました.

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1