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 の初期化をなんとかしたい.