debian Buster環境にPython3.7 Jupyter Labをセットアップ~PATHをいちいち手動設定しないとダメな原因を特定した

debian環境にPython3.7とpipを使ってJupyter Labをセットアップした際に、環境変数(PATH)の設定が自動で行われなかったのでメモがてら記録しておくことにします。誰かの参考になるかも知れないので。

まず、Synapticパッケージマネージャーから「python-pip」を検索してマークして適用すると関連パッケージがインストールされますが試してみて注意が必要な事が分かりました。

debian busterではPython2.7系と3.7系が共存している様なので、単にpythonとしたら2系を指定する事になり、ここでは意識的にpython3と指定する必要があります。

よってSynapticでインストールする際は、「python3-pip」をインストールしてやる必要があります。

Synapticから「pyton3-pip」のインストールを終えたら、ターミナルを起動して通常は

pip install jupyterlab(←これは間違い)

をインストールするのですがここでも要注意です。なぜなら先程インストールしたpipは3系なのでpip3とする必要があります。なので

pip3 install jupyterlab(←こっちが正しい:pip3を指定)

とする事になります。pip3でjupyterlabをインストールすると、ズラズラとメッセージが表示されますが途中で色付き文字のメッセージが表示されます。どうやら/home/username/.local/binのPATH設定を手動でする必要がある様です。

通常は

jupyter lab

とするとJupyter Labが起動するのですが、「jupyter:コマンドが見つかりません」と表示されます。bashがエラーを吐いているだけなので単に見つからないという事みたいです。やはりPATHが通ってない様です。

仕方ないのでファイルの所在(~/.local/bin/jupyter)を確認してjupyterファイルが存在することを確認したのでPATHを通してやります。

export PATH=~/.local/bin:$PATH

これでとりあえずPATHが通ったはずなので、再度ターミナルからコマンドで起動します。

jupyter lab

裏でJupyter Serverが無事に起動しました。自動的にWebブラウザが起動して画面がひらきました。簡単にjupyter labを使って動作テストをするととりあえずPythonコマンドに応じて正常に動作する事を確認できました。

これでdebian上で動作するPython3.7でJupyter Labを使用することが出来る事が確認出来ました。終了させる時はWebブラウザを閉じて、待機しているターミナルでCTRL+Cを押してJupyter Serverを終了させてやります。仕組みとしては裏で動いているJupyter ServerにWebブラウザでアクセスしてユーザーインターフェースを実現している様です。

しかし、先の環境変数への追加では一時的なものなのでターミナルを終了すると環境変数が消えてしまいます。そこでログインシェルとして使用しているbashの設定を確認して環境変数PATHを読み込む様に設定をします。

bashの設定ファイル~/.profileに記述されているのに?

bashの設定ファイルは下手に余計なファイルを増やすと読み込み優先順位が変わって動作がおかしな事になるので要注意です。さてどこに環境変数PATHを記すべきかなと、bashの設定ファイルを調べていて不可解な事に気づいてしまいました。なぜなら~/.profileには次の様な記述があり、このファイルが読み込まれていればわざわざ環境変数を追加する必要が無いはずなのです。

#set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH"
fi

私が使用したdebian buster x86 xfce版のbash設定ファイルを調べました。~/.profileの中に注意書きとして記されており、~/.bash_profile or ~/.bash_loginが有る場合はこのファイル(~/.profile)は読み込まれないとあります。

しかし該当ファイルは私の環境にはありません。なのに正しく読み込まれない?なぜ?

  1. .bashrc
  2. .profile
  3. .bash_history
  4. .bash_logout

~/.profileが正しく読み込まれれば特に何もしなくても~/.local/binがPATHに追加されるハズなのです。何かが変だと気づきました。他に原因が有りそうです。

ちなみにbashの設定に関係するファイルの優先度は下記のサイトがまとめられていて参考になります。

仕方ないのでmanを調べる事にした

そこで更に深堀りしてbashの仕様を確認する事にしました。するとmanの中に記述された有力な情報が得られました。

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

これを勝手な解釈で読む限り、~/.profileが働かないのは、インタラクティブ・ログインシェルとして働いていないか、–noprofileオプションが働いていると考えられます。ここを–login指定してやれば3つのファイルをスキャンして見つけたら設定を反映してくれるハズです。しかしわざわざ–loginを指定する箇所は無いのでは?と疑問に思いつつxfceのメニューにあるアイコンをクリックしターミナルを起動。どうやらこの操作が怪しいです。私はbashを意識して起動させていませんからね。ターミナルの設定を確認すると怪しい箇所を見つけました。

ターミナルをログインシェルに設定

デフォルトではターミナルが「ログインシェルとしてコマンドを実行する」になっていませんでした。まさかログインシェルとして起動してなかったとは!

ここにレ点を入れてから実行すると、無事に~/.profileが読み込まれた様でホームディレクトリのユーザーBINフォルダがPATHに追加されました。

コマンド「printenv PATH」で追加されている事がしっかりと確認出来ました。意外な落とし穴でしたが、bashの仕様について少し学習出来ました。片言の英文読みでもなんとかなるものです。(英語は苦手ですが)

さてこれで無事にローカル環境でPython+Jupyter Labを使える事になりました。ローカルに持っているCSVファイルを読み込ませて処理させるなど、制限の無い環境で実行したいので、Google Claboratoryから徐々に移行して行きます。

後々、VSCODE等の高機能なコードエディタに切り替えていく事も考えていますが、当面は慣れたJupyter Notebook系のインターフェースで練習しようと思います。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください