TL;DR:
%run
:
.pyの中身をセルに展開して実行したみたいな挙動
その後のセルの実行に影響する
!python
:
サブシェルでpython hoge.py
を実行
その後のセルの実行には影響しない
経緯
Google Colaboratoryで.pyファイルの実行方法に
%run hoge.py
!python hoge.py
の2種類があり、どちらでも実行できる。
両者に違いがあるのかないのかハッキリさせたい。
検証
hoge = 256
piyo = 512
print(hoge) # -> NameError
%run hoge.py
print(hoge) # -> 256
print(piyo) # -> NameError
!python piyo.py
print(piyo) # -> NameError
結果:%run
では名前空間が取り込まれたが、!python
はそうならない。
Google Colaboratoryで実験する
→ runPyFile.ipynb - Colaboratory
なぜ?
IPython公式ドキュメントの IPython as a system shell の節には
Since each command passed by IPython to the underlying system is executed in a subshell which exits immediately, you can NOT use !cd to navigate the filesystem.
と書かれている。
(
!
で始める)シェルコマンドはサブシェルで実行されてすぐに破棄される、よって!cd
ではカレントディレクトリは変更されない。(意訳)
つまり、!python
ではpythonがサブシェルで実行されるため名前空間が共有されることはない。
対して、Built-in magic commands の節には%run
について
This is similar to running at a system prompt
python file args
, but with the advantage of giving you IPython’s tracebacks, and of loading all variables into your interactive namespace for further use (unless -p is used, see below).
と書かれている。
シェルで
python [.pyファイル] -引数...
とやるのに似てるけど、トレースバックと名前空間のロードが付いてきてお得。(意訳)
つまり、%run
では.pyファイルで用意した変数が次のセル以降でも維持される。
逆に%run
実行以前に定義していた変数は%run
の実行で上書きされる。
(-p
オプションの挙動と変数の上書きは runPyFile.ipynb - Colaboratory でも実験できる)