jupyter labのスタンドアローン版というのが最近リリースされたらしいです。
そういや昔ちょろっと聞いたような気がするなーと思ってたんですが、リリース履歴を見ると3年ほど放置されてたようですね。
私がjupyter labを使う時は、
- google colabで使う
- dockerからjupyter/scipy-notebook を起動して使う
のどちらかでやってたんですが、どちらの場合も起動した後で必要なファイルが不足してた時に取りに行くのが面倒 というビミョーな問題がありました。
colabの場合は、小さめのファイルなら都度アップロードすれば良いのですが、しばらく放置してるとインスタンスを落とされるという制限があります(課金すれば回避できるけど)。また、毎回アップロードするのを避けるために、必要なファイルをgoogle driveに置いて、notebookの最初の方でマウントするという運用もできるんですが、これをやると数GB単位のファイルを扱うようなコードを書いているとgoogle drive側が破綻します(こっちも課金で回避はできるけど・・・)
一方dockerの方は
docker run --rm -p8888:8888 -v${PWD}:/home/jovyan/work jupyter/scipy-notebook'
という感じで、カレントディレクトリをworkにマウントして使っているので、起動してから「しまったマウントポイントより上の階層に置いてあるファイルが必要だったorz」なんてことが稀に良くあります。
こちらも、jupyterlabの機能を使ってアップロードするなり、docker cp
で送り込むという手はあるんですが、ローカルのストレージ内にあるファイルをわざわざコピーしないと使えないというのもちょっとフラストレーションが溜まります。
というわけで、どちらも一応問題無く使えてるんだけど、微妙に使い勝手が悪いのでで、問題無いようならこの機に乗り換えてみようと思います。*1
インストール
今のところhomebrewからは入れられないようなので、githubのリリースページからpkgをダウンロードしてインストールします。
Releases · jupyterlab/jupyterlab_app · GitHub
インストールは通常のmac用のアプリと同じです。 窓の杜の記事だと、インストール時に何か聞かれてるようですが、mac版では特にインストール中にいじれる設定はありませんでした。
正常にインストールできたら、こんな感じのアイコンがlaunchpadに表示されるので、これをクリックして起動します。
初回起動時なのに、以前native環境にインストールしたjupyterlabを使っていた時のものと思われるnotebookがいきなり開いた状態で起動したので、一瞬パニックになりましたが一旦全部のタブを閉じてアプリを終了してから再度起動すると、こんな感じのlauncher画面になります。
窓の杜の記事をざっと見たところ、jupyter lab app専用にcondaでpythonもパッケージも入れてくれているという話だったので、まずはその辺を確認しましょう。
terminalタブを開いて、バージョンを確認します。
MBA:so5 so5$ python --version Python 2.7.16 MBA:so5 so5$ python3 --version Python 3.8.9
続いてterminal appを起動してpythonのバージョンを確認します。
so5@MBA ~ % python --version Python 2.7.16 so5@MBA ~ % python3 --version Python 3.9.7
確かにpython3のバージョンが違うものが使われてますね。
入っているパッケージも一応比較してみましょう。
MBA:so5 so5$ conda list # packages in environment at /Applications/JupyterLab.app/Contents/Resources/jlab_server: # # Name Version Build Channel anyio 3.3.2 py38h50d1736_0 conda-forge appnope 0.1.2 py38h50d1736_1 conda-forge argon2-cffi 20.1.0 py38h96a0964_2 conda-forge async_generator 1.10 py_0 conda-forge attrs 21.2.0 pyhd8ed1ab_0 conda-forge babel 2.9.1 pyh44b312d_0 conda-forge backcall 0.2.0 pyh9f0ad1d_0 conda-forge backports 1.0 py_2 conda-forge backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge bleach 4.1.0 pyhd8ed1ab_0 conda-forge brotlipy 0.7.0 py38h96a0964_1001 conda-forge ca-certificates 2021.5.30 h033912b_0 conda-forge certifi 2021.5.30 py38h50d1736_0 conda-forge cffi 1.14.6 py38h1a44b6c_1 conda-forge chardet 4.0.0 py38h50d1736_1 conda-forge charset-normalizer 2.0.0 pyhd8ed1ab_0 conda-forge colorama 0.4.4 pyh9f0ad1d_0 conda-forge conda 4.10.3 py38h50d1736_2 conda-forge conda-package-handling 1.7.3 py38h96a0964_0 conda-forge cryptography 3.4.7 py38h1fa4640_0 conda-forge cycler 0.10.0 py_2 conda-forge debugpy 1.4.1 py38ha048514_0 conda-forge decorator 5.1.0 pyhd8ed1ab_0 conda-forge defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge entrypoints 0.3 pyhd8ed1ab_1003 conda-forge freetype 2.10.4 h4cff582_1 conda-forge idna 3.1 pyhd3deb0d_0 conda-forge importlib-metadata 4.8.1 py38h50d1736_0 conda-forge ipykernel 6.4.1 py38h5fd9f69_0 conda-forge ipython 7.28.0 py38h5fd9f69_0 conda-forge ipython_genutils 0.2.0 py_1 conda-forge ipywidgets 7.6.5 pyhd8ed1ab_0 conda-forge jbig 2.1 h0d85af4_2003 conda-forge jedi 0.18.0 py38h50d1736_2 conda-forge jinja2 3.0.1 pyhd8ed1ab_0 conda-forge jpeg 9d hbcb3906_0 conda-forge json5 0.9.5 pyh9f0ad1d_0 conda-forge jsonschema 3.2.0 pyhd8ed1ab_3 conda-forge jupyter_client 7.0.3 pyhd8ed1ab_0 conda-forge jupyter_core 4.8.1 py38h50d1736_0 conda-forge jupyter_server 1.11.0 pyhd8ed1ab_0 conda-forge jupyterlab 3.1.13 pyhd8ed1ab_0 conda-forge jupyterlab_pygments 0.1.2 pyh9f0ad1d_0 conda-forge jupyterlab_server 2.8.2 pyhd8ed1ab_0 conda-forge jupyterlab_widgets 1.0.2 pyhd8ed1ab_0 conda-forge kiwisolver 1.3.2 py38h12bbefe_0 conda-forge lcms2 2.12 h577c468_0 conda-forge lerc 2.2.1 h046ec9c_0 conda-forge libblas 3.9.0 11_osx64_openblas conda-forge libcblas 3.9.0 11_osx64_openblas conda-forge libcxx 12.0.1 habf9029_0 conda-forge libdeflate 1.7 h35c211d_5 conda-forge libffi 3.4.2 he49afe7_4 conda-forge libgfortran 5.0.0 9_3_0_h6c81a4c_23 conda-forge libgfortran5 9.3.0 h6c81a4c_23 conda-forge liblapack 3.9.0 11_osx64_openblas conda-forge libopenblas 0.3.17 openmp_h3351f45_1 conda-forge libpng 1.6.37 h7cec526_2 conda-forge libsodium 1.0.18 hbcb3906_1 conda-forge libtiff 4.3.0 h1167814_1 conda-forge libwebp-base 1.2.1 h0d85af4_0 conda-forge llvm-openmp 12.0.1 hda6cdc1_1 conda-forge lz4-c 1.9.3 he49afe7_1 conda-forge markupsafe 2.0.1 py38h96a0964_0 conda-forge matplotlib-base 3.4.3 py38hc7d2367_1 conda-forge matplotlib-inline 0.1.3 pyhd8ed1ab_0 conda-forge mistune 0.8.4 py38h96a0964_1004 conda-forge nbclassic 0.3.2 pyhd8ed1ab_0 conda-forge nbclient 0.5.4 pyhd8ed1ab_0 conda-forge nbconvert 6.2.0 py38h50d1736_0 conda-forge nbformat 5.1.3 pyhd8ed1ab_0 conda-forge ncurses 6.2 h2e338ed_4 conda-forge nest-asyncio 1.5.1 pyhd8ed1ab_0 conda-forge notebook 6.4.4 pyha770c72_0 conda-forge numpy 1.21.2 py38h49b9922_0 conda-forge olefile 0.46 pyh9f0ad1d_1 conda-forge openjpeg 2.4.0 h6e7aa92_1 conda-forge openssl 1.1.1l h0d85af4_0 conda-forge packaging 21.0 pyhd8ed1ab_0 conda-forge pandas 1.3.3 py38ha53d530_0 conda-forge pandoc 2.14.2 h0d85af4_0 conda-forge pandocfilters 1.5.0 pyhd8ed1ab_0 conda-forge parso 0.8.2 pyhd8ed1ab_0 conda-forge patsy 0.5.2 pyhd8ed1ab_0 conda-forge pexpect 4.8.0 pyh9f0ad1d_2 conda-forge pickleshare 0.7.5 py_1003 conda-forge pillow 8.3.2 py38hee640a0_0 conda-forge pip 21.2.4 pyhd8ed1ab_0 conda-forge prometheus_client 0.11.0 pyhd8ed1ab_0 conda-forge prompt-toolkit 3.0.20 pyha770c72_0 conda-forge ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge pycosat 0.6.3 py38h96a0964_1006 conda-forge pycparser 2.20 pyh9f0ad1d_2 conda-forge pygments 2.10.0 pyhd8ed1ab_0 conda-forge pyopenssl 20.0.1 pyhd8ed1ab_0 conda-forge pyparsing 2.4.7 pyh9f0ad1d_0 conda-forge pyrsistent 0.17.3 py38h96a0964_2 conda-forge pysocks 1.7.1 py38h50d1736_3 conda-forge python 3.8.12 h17280f6_0_cpython conda-forge python-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge python_abi 3.8 2_cp38 conda-forge pytz 2021.1 pyhd8ed1ab_0 conda-forge pyzmq 22.3.0 py38hd3b92b6_0 conda-forge readline 8.1 h05e3726_0 conda-forge requests 2.26.0 pyhd8ed1ab_0 conda-forge requests-unixsocket 0.2.0 py_0 conda-forge ruamel_yaml 0.15.80 py38h96a0964_1004 conda-forge scipy 1.7.1 py38hd329d04_0 conda-forge seaborn 0.11.2 hd8ed1ab_0 conda-forge seaborn-base 0.11.2 pyhd8ed1ab_0 conda-forge send2trash 1.8.0 pyhd8ed1ab_0 conda-forge setuptools 58.0.4 py38h50d1736_2 conda-forge six 1.16.0 pyh6c4a22f_0 conda-forge sniffio 1.2.0 py38h50d1736_1 conda-forge sqlite 3.36.0 h23a322b_2 conda-forge statsmodels 0.12.2 py38hbe852b5_0 conda-forge terminado 0.12.1 py38h50d1736_0 conda-forge testpath 0.5.0 pyhd8ed1ab_0 conda-forge tk 8.6.11 h5dbffcc_1 conda-forge tornado 6.1 py38h96a0964_1 conda-forge tqdm 4.62.3 pyhd8ed1ab_0 conda-forge traitlets 5.1.0 pyhd8ed1ab_0 conda-forge urllib3 1.26.7 pyhd8ed1ab_0 conda-forge wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge webencodings 0.5.1 py_1 conda-forge websocket-client 0.57.0 py38h50d1736_4 conda-forge wheel 0.37.0 pyhd8ed1ab_1 conda-forge widgetsnbextension 3.5.1 py38h50d1736_4 conda-forge xz 5.2.5 haf1e3a3_1 conda-forge yaml 0.2.5 haf1e3a3_0 conda-forge zeromq 4.3.4 he49afe7_1 conda-forge zipp 3.5.0 pyhd8ed1ab_0 conda-forge zlib 1.2.11 h7795811_1010 conda-forge zstd 1.5.0 h582d3a0_0 conda-forge
listの中にseabornが入っていますが、実はこれ初期状態でリストを取るのを忘れてて、私が後から入れてしまったパッケージなので、デフォルトでは入ってません。 しかし、pandas, matplotlib, numpy, scipyあたりは入ってるので*2この辺を使いたい人は特に追加で入れなくてもひととおり揃った環境と言えそうです。
terminal appではそもそもcondaにパスが通っていないので、違うところを見てるのは間違いないのですが 一応pip3で確認すると、これだけしかパッケージは入ってませんでした。
so5@MBA ~ % pip3 list Package Version ---------- ------- labelImg 1.8.5 lxml 4.6.3 pip 21.2.4 PyQt5 5.15.4 PyQt5-sip 12.8.1 setuptools 57.4.0 wheel 0.37.0
というわけで、こちらの環境をどんなにいじったところで、デフォルトのpython環境には影響しないようです。
私みたいにjupyter labをpytonの開発環境として使ってると、jupyter labで開発してファイルに保存したpythonスクリプトをterminaから起動しようとして依存パッケージが足りないなんていうトラブルが起きそうな気もしますが、そんときゃそん時でなんとかしましょう :p
使い方
使い方は通常のjupyterlabやgoogle colabなんかと概ね同じ感じです。
colabとjupyterlabでショートカットキーとか色々と違うだろうという意見もあるかと思いますが、正直に言うとどちらもそんなに使い込んでないので、私にはレビューのしようがありませんo...rz
とりあえず、先週末にインストールして3日ほど使った感じでは、特に違和感無く使えています。
また、webアプリとして使っていた時と違って、CTRL+TABで簡単に切り替えられるので、ブラウザのタブを大量に開いて調べながらコードを書いてる時なんかは、すぐに戻ってこれるのが地味に便利ですw
まとめ
まとめるほどの内容もないんですが、最後にひとことだけ書いとくと
「jupyter lab appはいいぞ」