WSL で Jupyter Notebook を使う場合,そのままだと WSL 環境内のブラウザを開こうとする.X サーバーが常に起動されているわけではないし,たいていは Windows 側ですでにブラウザが立ち上がっていることが多いのでこちらを使いたい.
Jupyter Notebook を実行すると Windows 側のブラウザを立ち上げる or すでにブラウザが立ち上がっている場合は新規にタブを作るようにして,そこから Jupyter Notebook を扱えるようにする.また,できれば Windows からショートカットをクリックすると Jupyter Notebook が起動するようにしたい (堕落).
やりたいこと
- WSL 上の Python 環境で Jupyter notebook を実行する.
- ブラウザは (X Window ではなく) Windows 上のブラウザを使う.
- Windows からショートカットとして呼び出せるようにする.
アプローチ
- Jupyter notebook の実行時に開かれるブラウザは
BROWSER
環境変数で指定する.ここでブラウザとして wslview を指定すると Windows 側のデフォルトブラウザが使われる.- wslview は wslu パッケージに含まれる.
--browser
オプションを指定しても同じはずだがBROWSER=wslview jupyter ...
は期待通りの動きをするのに--browser=wslview
はうまくいかない (Jupyter 6.0.2).
- Jupyter 6.0 以降,ブラウザには redirect file の URL (
file:///...
) が渡されるようになったが,Windows 上のブラウザからはアクセスできない.従来通りに token つき URL (http://...
) を直接渡すようにするためには--NotebookApp.use_redirect_file=False
とする.- Jupyter 6.0 には redirect file の使用有無に関するオプションがないので,URL を頑張って書き換えるか,おとなしくバージョンを上げる (Jupyter 6.0.2 にはある).
wsl
コマンド (C:\Windows\System32\wsl.exe
) を使うと Windows から WSL 環境内のプログラムを実行できる.- 実行されるプログラムは非対話シェル経由で実行される (
.bashrc
や.zshrc
は呼び出されない) ことに注意.つまり,pyenv の初期化を.zshrc
の中でしているとパスが適切に設定されない (はまった).
- 実行されるプログラムは非対話シェル経由で実行される (
やったこと
いずれもあらかじめ WSL 環境に wslu をインストール (apt install wslu
)
しておくこと.
Windows からの実行
ショートカットを作成し,「リンク先」に下記を設定する (同内容のバッチファイルを作ってそこにリンクしても良い).ダブルクリックすると WSL 上で Jupyter Notebook が実行され,Windows 上のブラウザが立ち上がる or ブラウザに新しいタブができる.
C:\Windows\System32\wsl.exe zsh -ic "BROWSER=wslview jupyter notebook --NotebookApp.use_redirect_file=False"
WSL 環境からの実行
以下の内容のシェルスクリプトを作成する.実行すると Windows 上のブラウザが立ち上がる or ブラウザに新しいタブができる.
BROWSER=wslview jupyter notebook --NotebookApp.use_redirect_file=False
なお,あまり環境を汚さないよう明示的にオプションを指定する方針としたが,以下の設定をすれば単純に jupyter notebook
と実行するだけで同じことができるようになる.
wslview -r
により wslview をデフォルト Web ブラウザとして登録しておくとBROWSER=wslview
が不要になる.\~/.jupyter/jupyter_notebook_config.py
で use_redirect_file に関する設定をしておけば--NotebookApp...
も不要になる.- セキュリティ上の理由から redirect file の仕組みは導入されているが,個人 PC でローカルに Jupyter を実行する分にはあまり関係ない.
おまけ
--notebook-dir=<dir>
で初期ディレクトリを指定できる.必要に応じて.
気になること
- わざわざ対話シェル経由で立ち上げるのは何か違う.実害はないけど少し気持ち悪い.pyenv の初期化をなんとかしたい.