みなさん、よいPython生活送れていますでしょうか?
いきなりですが、普段Pythonのコードを扱う際、どのように扱っていますか?
普通に.py
のファイルを作成して動かしたり、もしくはJupyter NotebookやJupyter Labなどを使ってコードブロックにコードを書いてブロックごとに実行していく、という人も多いと思います。自分は大学の授業で配布されているPythonコードの資料がJupyterで扱える.ipynb
形式のファイルなので、今まではJupyter Notebookを使ってコードを閲覧・実行等行っていました。
しかし、みなさん、Jupyter Notebookを立ち上げてブラウザのタブ1, 2個取られるの、なんか嫌じゃないですか? 特にChromeユーザーの方はそのように思う方も多いのではないでしょうか?
自分も以前、そのような考えから、MicrosoftのVisual Studio Code (VS Code)を使って.ipynb
ファイルを扱うようになりましたが....正直扱いづらい。カーネルの再起動や強制終了など、直感的に行なえません。 (ちなみに最近知ったんですが、VS Codeではファイルを閉じるとカーネル終了らしいです)
なので、自分の場合は、最初はJupyter Notebookで→試しにVS Codeで.ipynb
を開く→やっぱりJupyter Notebookに戻る、という形で結局はJupyter Notebookを使い続けていました。 (Jupyter LabはなんかUI慣れないんで個人的に使ってませんでした)
しかし、ふとした時にMicrosoftのドキュメントを見ていたら、面白いものを見つけてしまいました。私はPython初心者なので、「それ前からあるし!」という方がいるかもしれませんが、VS Codeでは.py
ファイルでJupyterのような形でコードを触ることができることを知りました。
ここで、「その機能知ってるし!前からあったし!」という方はブラウザバックしてください...で、そうでない方はぜひ最後までご覧いただけると幸いです。 (よければLGTMしていただけると嬉しいです!)
どういう機能なのか
以下はMicrosoftのドキュメントに記載されていた画像なのですが、.pyのファイルを用意していただいて、そこで最初の行に#%%
と書きます。これがJupyterで言うコードブロックの頭だよ、という宣言になって、その下にコードを書くとそこがまるで1つのコードブロックのようにVS Code上で動作します。
* Microsoftのドキュメントから引用
通常は下の画像のように、コードブロックがあってそこに書き込んでいって実行するスタイルなのですが、それと同じことが.py
ファイルにおいてもできる、ということです。
* Microsoftのドキュメントから引用
この機能のメリット
個人的にはメリットしかないと感じています(笑)
メリット 1: .pyファイルにすることでファイル管理が楽
まず、.py
ファイルにすることによって、Gitシステム上での管理が楽になります。.ipynb
ファイルの場合は、中身がJSONのような配列になっているため、Git上で差分確認等が非常にしずらいです。そのせいで中身の配列が破損してしまい、.ipynb
ファイルが全く開けなくなってしまったことも何度かありました (自己復旧させましたが)。なので、中身がソースコードだけしか入ってない、単純な内容になっている.py
ファイルはそういう時の管理が楽なため、Gitユーザーは.py
で管理する方がよいかと個人的に思います。
また、上記の点から、わざわざJupyter環境でファイルを開かなくてもソースコードが閲覧できるため、Slackでこの部分だけコードを共有したい、という場合でもすばやく共有ができます。
メリット 2: .ipynb_checkpointsが生成されない
地味に厄介なものがこの.ipynb_checkpoints
だと思います。このフォルダは.ipynb
ファイルを実行する際に、Jupyter Notebookなどでは自動保存機能がかかって一時的な実行状態が保存されるのですが、その行き先がこの.ipynb_checkpoints
フォルダです。特に機械学習などでフォルダからファイルを取ってくる、といった際に.ipynb_checkpoints
があると誤動作を起こす可能性があり、細心の注意を払う必要があります。これが生成されないのは、特に機械学習などのコードを触っている方にとっては利点しかないのではないでしょうか?
メリット 3: レスポンスが早い
VS Codeで.ipynb
ファイルを開く際、ユーザーがファイルを選択してから、ファイルを読み込んでコードブロック状になったものが表示されるまでかなり時間がかかってしまいます。対して、Jupyter Notebookの場合でも、VS Codeで.py
ファイルを開く場合でも、この開く際のレスポンスは非常に早いのでVS Codeで.ipynb
を扱うことに対してハードルを感じている方も多いのではないでしょうか。
また、個人的に使っている際、VS Codeで.ipynb
を使うとフリーズしてしまったり、実行状況がわからなくなってしまうことなどがたまに発生していましたが、現在は (メリット4のおかげもありますが)そのようなことは発生していないため、レスポンスが早く、安定しているのではないかと思います。
メリット 4: カーネルの再起動・終了がしやすい
一番最初に出した画像をもう一度ご覧いただくとわかるかと思いますが、この機能を使った場合、実行結果は右の別ウィンドウに出力されます。実質そこがJupyter環境のようになっているのですが、今まではカーネルの再起動・終了を行いたい場合、.ipynb
ファイルを一回保存してから閉じて、もう一度開かなければいけません。また、さきほどメリット3で述べたように、.ipynb
を開く際、かなりレスポンスが遅くいらついてしまうこともしばしば...ですが、.py
ファイルでJupyter環境を開けばカーネルを再起動・終了させたい場合は右のJupyterのウィンドウを閉じるだけ! だいぶストレス軽減されると思います。
メリット 5: Jupyterと同じ機能はそれでも使え+αで役立つ機能も使える
VS CodeでJupyterファイルを扱うことのメリットとしては、変数の格納状況を確認できることも一つのメリットではないのでしょうか。地味に便利な機能だと思いますが、.py
でJupyterを扱う際も、Jupyterウィンドウから変数の格納状況を確認できます。また、Jupyterウィンドウの下の部分にType code here and press shift-enter to run
というセクションがあり、ここで任意のコードをすばやく実行することができます。print文など、ファイルに書くまでもないけど状況を確認したい場合などに使えるので便利です。
メリット 6: プロジェクトごとの管理がしやすい
ちょっと長くなってきてしまいましたが、もうしばらくお付き合いください...
VS CodeにはWorkspaceという機能があり、これによってプロジェクトごとに環境やコードを管理することができます。Pythonプロジェクトに関しても同様で、Pythonの実行環境やコードが置いてあるディレクトリ、また前回ワークスペースを開いていたときに開いていたファイルを再度表示してくれたりと複数のプロジェクトを1つのパソコンに置いている場合 (ほとんどの方がそうだと思いますが)、便利な機能です。また、Pythonの実行環境もWorkspaceごとに管理できるため、とくにVirtualenv, Pipenvなどを使用している方には助かる機能なのではないでしょうか?
メリット 7: Chromeのタブが取られない!
これはChromeのヘビーユーザーにとっては非常に重要ですね... Jupyter Notebookのページにタブがとられず、アイコンがまた更に見やすくなりますね。
え、タブ多すぎだって? きのせいですよ、きっと。
メリット 8: WSLとの親和性が高い (Windowsユーザーのみ)
最後のメリット、WSLとの親和性です。Windowsユーザーの方は最近盛り上がってるWSL、もうご存知の方も多いのではないでしょうか? Windowsの中でUbuntuなどLinux環境をたてることができ、非常に重宝しています。このWSL、VS Codeでは便利に扱えるように、WSL専用拡張機能なるものが出ています。これを使うことによって、より便利にWSL環境内のPython環境を操作することができます。個人的にはこの拡張機能、重要です。
この機能のデメリット
一方でデメリットもあるのできちんと紹介しておきます。
デメリット 1: 実行結果が残らない
メリット1で述べたように、.ipynb
ファイルの中身はJSONのような配列のデータが入っています。そのため、.py
ファイルと違い、実行結果、つまりprint文で出力された内容やmatplotlibの画像、pandasの表などがそのまま見ることができます。実行結果も含めて誰かと共有したい、という場合には.ipynb
形式のファイルで渡すほうがいいですね。
まとめ
デメリット、1つしか思いつきませんでした... しかし、それくらい個人的にはこのVS Codeで.py
ファイルでJupyter環境を使う、というこの機能、非常に期待しています。セットアップも非常にかんたん (ファイルを用意して#%%
をつけるだけ)なので、みなさんもぜひ、試してみてはいかがでしょうか?