始めに
JupyterLabを導入した時の個人的なメモ。環境構築は忘れやすいので。
参考資料
-
- Installation — JupyterLab 2.2.6 documentation
-
- https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html
-
- JupyterLabのすゝめ – Qiita
- https://qiita.com/kirikei/items/a1639954ce5ccaf7ac3c
実行環境
Anacondaユーザーはpipと競合するので、この記事の対象外です。
-
- macOS Catalina 10.15.6
-
- pip 20.2.2
- python 3.8.5
インストール
$ pip install jupyterlab
これだけです。ただし、Jupyter Notebook 4.3以上が必要なので
$ jupyter notebook --version
で確認しておきます。この時は6.1.3でした。
起動
$ jupyter lab
これでSafariが自動で起動し、JupyterLabが使えるようになりました。この時のURLが http://localhost:8888/lab となっていると思います。
リモートでJupyterLabを使いたい時
参考:
-
- https://qiita.com/shinochin/items/23e78499bc78b90fbc62
- https://blog.amedama.jp/entry/jupyter-nb-ssh-port-forwarding
まずリモートサーバーにjupyterをインストールします。sshでリモートサーバーにアクセスして
$ pip install jupyter
$ pip install jupyterlab
を実行。ちなみに導入した時のバージョンは jupyter-notebook : 6.0.3 でした。
次にJupyterLab (Jupyter Notebook)のパスワードを設定します。xxxxxの部分は適宜自分で決めて下さい。
$ python3
>>> from notebook.auth import passwd
>>> passwd('xxxxx', algorithm='sha512')
>>> exit()
すると ‘sha512:…:…’という長い英数字の羅列が出てくるので、これをコピーしておきます。
次にJupyterの設定ファイルを生成して中身を書き換えます。エディタはvi以外でも良いし、jupyter_notebook_config.pyの置いてある場所は人によって違うかもしれません。
$ jupyter notebook --generate-config
$ vi ~/.jupyter/jupyter_notebook_config.py
色々と設定できますが、最低限以下を書き換えます。sha512…はさっき見たやつです。8889の部分は何でも良いですが、ローカルでJupyterを立ち上げた時の自動設定と競合するので8888は避けています。
c.NotebookApp.ip = 'localhost'
c.NotebookApp.open_browser = False
c.NotebookApp.password_required = True
c.NotebookApp.password = 'sha512:...:...'
c.NotebookApp.port = 8889
場合によってはJupyterのPATHの設定が必要です。エラーに遭遇したら~./bashrcに書き加えましょう。source ~/.bashrcも忘れずに。
export JUPYTER_CONFIG_DIR=/(absolute_path)/(to)/.jupyter
export JUPYTER_DATA_DIR=/(absolute_path)/(to)/share/jupyter
export JUPYTER_RUNTIME_DIR=/(absolute_path)/(to)/share/jupyter/runtime
これでリモート側の設定が完了しました。Jupyter Notebookを使いたい場合は
$ jupyter notebook
JupyterLabを使いたい場合は
$ jupyter lab
と打ちます。
ここで、別のターミナルを立ち上げてローカルでの操作を行います。(開発中に一旦ログアウトして以下のsshをやり直すのが面倒で、ssh port forwarding専用のターミナルを開いている)
$ ssh -NL 8889:localhost:8889 <ssh先の名前>
1つ目の8889は次のURLに対応していて、2つ目の8889はリモートでJupyterの設定ファイルに書いた4桁の数字です。そしてブラウザで http://localhost:8889/を開きます。パスワードが求められるので、ここではxxxxxを入力します。実際にはもう少し真面目なパスワードを設定しましょう。
以上、リモート環境でJupyterLabが使えるようになりました。この後に書く設定は、サーバーごとにやる必要がありそうです。
カスタマイズ
カスタマイズについては徐々に追加して行こうと思うのですが、例えば
Settings → JupyterLab Theme → JupyterLab Dark
とすると、長時間作業しても目に優しいダークモードになります。
拡張機能の追加(Gitの例)
例えばGitの拡張機能を入れたいとしましょう。JupyterLabの左端にあるアイコンの中に、パズルのピースみたいなのがあります。ここからgitと検索すると、@jupyterlab/gitというJupyterLab公式のGitHubページ( https://github.com/jupyterlab/jupyterlab-git )が出てきました。それによると、以下の2行でインストールできるそうです。
$ pip install --upgrade jupyterlab-git
$ jupyter lab build
ところが、
An error occured.
ValueError: Please install Node.js and npm before continuing installation. You may be able to install Node.js from your package manager, from conda, or directly from the Node.js website (https://nodejs.org).
というエラーメッセージが出てしまいました。Node.jsがインストールされていないとbuildできないよ、ということです。確かに、JupyterLabの公式ドキュメントには
In order to install JupyterLab extensions, you need to have Node.js installed.
と書いてありました。ここでは、Homebrewを用いてNode.jsを入れることにします。
結論として、以下の3つの手順でGitの拡張機能を導入できます。
$ brew install node
$ pip install --upgrade jupyterlab-git
$ jupyter lab build
どうでしょう?上のメニューの中にGitというのが現れるはずです。もし無ければ、JupyterLabを再起動してみましょう。
ちなみにGit初心者ですが、git add, git commitとかは簡単だけどgit merge, git logはパッとできなかったので別の場所でコマンド叩こうかなと思いました。
基本操作
ここは雑記です。
-
- JupyterLabを使う動機の一つでもあった、複数ファイルの一覧表示をするには、一度編集したいファイルを全て開いた上でドラッグで配置を変えます。すると、今まではタブをクリックしないと見えなかったファイルが同時に見られるようになります。直感的で使いやすいです。
-
- .ipynbファイルの扱い方は従来のJupyter Notebookと同じです。しかしJupyterLabでは、同じ.ipynbファイルを横に並べて同期させながら編集することもできます。手順としては、コピーしたいタブの上で右クリックからNew View for Notebookを選択します。
-
- また別の.ipynbファイルにセルごとコピーすることもドラッグで可能です。「ここで書いたコードをあっちでも使いたい」という時に、今までは上から下からスクロールしまくっていたので、これで楽になります。( https://jupyterlab.readthedocs.io/en/stable/user/notebook.html )
-
- セルの上で右クリックをしてCreate New View for Outputを選択すると、Output Viewというモードのタブが出てきます。これはそのセルの実行結果だけを表示するもののようです。例えば長い表などを出力した時に別のタブで見られると作業しやすい?
- File → New Console for NotebookとするとIPython風のタブが出てきて、対話的にコマンドを実行することができます。簡単な挙動を確かめてからコードに盛り込む時に使えそう。
終わりに
今後も記事執筆を頑張ります。