以下の内容はhttps://uepon.hatenadiary.com/entry/2025/01/10/015419より取得しました。


【メモ】Google Colabのシェルコマンド(!cd)とマジックコマンド(%cd)の違い

基本的にはローカルで動くコードを書くほうが好きなのですが、動作環境を渡すことやGPUのVRAMが8GB以上必要なプログラムの場合にGoogle Colabを使っています。あんまり慣れていないので結構な頻度でハマります。

今回ハマったこと

コードによって生成したファイルをzip圧縮してダウンロードしたかったのですが、以下のように実行するとエラーが発生します。

処理としては/content/drive/MyDrive/witty/resultsに格納されているcsvファイルzipファイルに固めて/content/data.zipに保存するといったものです。圧縮時にディレクトリ構造は不要だったので-jオプションをつけています。

!cd /content/drive/MyDrive/witty/results && zip -j -u /content/data.zip *.csv

どうやってもうまくいかないので調べてみると前半のcdがうまく行っていないことが原因でした。

!cdがうまくいかない理由

結構有名な話なのでご存知の方も多いと思いますが、 !は実行が一時的な実行で状態は保持されないということです。今回は&&で区切られている前半コマンドと後半コマンドでパスの変動がないという状態です。ワンライナーであれば大丈夫かなと思ったのですが、&&の前後でプロセスが別れているために発生しているのでした。

もし、実行状態を保持するのであれば%(マジックコマンド)を使用するほうが良いとなります。

!%の違い

2つの差をまとめると…

! (エクスクラメーションマーク)

  • シェル(OSのコマンド)を実行するための構文
  • 例:!cd /path/to/dir
  • 一時的な実行で、状態は保持されない(例:!cd で移動しても次のセルには影響しない)

% (パーセント記号) - マジックコマンド

  • IPython/Jupyterの特殊コマンド(マジックコマンド)を実行
  • Pythonの実行環境に直接影響を与える
  • 状態が保持される

%の効果が得られる例

  • %cd - ディレクトリ移動(状態が保持される)
  • %run - Pythonスクリプトを現在の名前空間で実行
  • %time - コードの実行時間を計測
  • %matplotlib inline - matplotlibの出力をノートブック内に表示

簡単な比較例

今回であれば以下のように実行すれば正解かなと思います。

%cd /content/drive/MyDrive/witty/results
!zip -u /content/data.zip *.csv

%cdの間にスペースは不要です。

おわりに

今更、気がつくなんて恥ずかしい😫




以上の内容はhttps://uepon.hatenadiary.com/entry/2025/01/10/015419より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14