【注意】あなたがroot権限で作業をしていないならこの記事は有用でないと思います。今回の問題はroot権限で作業しているから起こっているものなので一般ユーザーの方は読まなくても大丈夫だと思います。
普段WSl上で開発を行っているのですが、今日久々にPythonを書こうとしたら詰まった点について解説していきます。
*問題発生から解決まで丸一日消費してしまった...
動作環境
- WSL2
- Ubuntu 18.04
- pyenv 1.2.18-12-g098227f2
- python 3.8.2
- pip 20.1
- pipenv 2018.11.26
pythonのバージョン管理のためにpyenvを使っています。更にプロジェクトディレクトリ内の仮想環境を整えるためにpipenvを使っています。外部モジュールはpipenv経由でインストールするようにしています。
環境構築
以下のコマンドで仮想環境を整えます
mkdir py_playground && cd py_playground
pipenv --python 3.8
インストールした外部モジュール
- flake8
- autopep8
- mypy
- ipython(必須)
- jupyterlab(必須、notebookでもいいけど今からやるならlabだよね)
- numpy
- scipy
- matplotlib
初期ディレクトリ構成
Pipfile(Node.jsでいうところのpackage.jsonみたいなもの)
Pipfile.lock
どこで詰んだのか
いつもどうりvscodeを立ち上げてJupyterNotebookでも書こうかなと思って、新規のノートブックを立ち上げたその時...
カーネルが接続してくれない
おかしい、pipenvで仮想環境は整えているはずなのに...
こうして私はJupyterを起動させるための長い長い旅に出た
問題1 デフォルトでは.venvディレクトリが生成されない
windows上で開発してたときはうまく行ったんだ...何が違うんだ...
まず発見したのはインタプリタが入っているはずの.venvディレクトリが生成されていないのである。
これはpipenvのデフォルト設定のとき仮想環境は~/.local/share/virtualenvs/
の下に生成されているのである。
ひとまずこいつを変更することにした。
pipenv で任意の場所の仮想環境を使う を参考にして以下のように.zshrcに記述した(bashの人は.bashrcに書いてください)
export PIPENV_VENV_IN_PROJECT=1
これでとりあえずプロジェクトディレクトリ直下に.venvディレクトリが生成されるようになった。だがまだ接続できていない。
問題2 ターミナルからjupyterが立ち上がるようにしてみよう
jupyter lab
するとエラーが出た。どうやらroot権限で実行することは非推奨らしく、その場合は--allow-root
を追加しろとのこと
jupyter lab --allow-root
だが今度は何も表示られなくなった。
いろいろ探した結果、設定ファイルを作成すればうまく表示されるようになった。
jupyter notebook --generate-config
生成された設定用スクリプトの先頭に以下を追加した。
c = get_config()
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8080
よしターミナルに接続状況が表示されるようになった。
問題3(これが解決策です) vscodeのjupyter系の設定がデフォルトのままだとうまくいかない
どうやらvscodeでjupyterを立ち上げるとそのタイミングでjupyter serverを立ち上げるようである。そこで問題2が邪魔をする。
そこでvscode内で--allow-root
を設定した。
F1を押す->検索フィールドに「python jupyter arg」と入力すると先頭にpython: specify jupyter commandline argument
が表示されると思う。それを選択して--allow-root
と入力する。
最終的にこれで解決した。
めでたしめでたし