Python利用環境構築メモ(その2)jupyter lab を使う

Python

サーバーに jupyter lab をインストールし、ローカルのPCから利用する環境を整えました。その時の手順のメモです。
【前提】
・ローカルのPC環境:Windows10 とします。

jupyter lab のインストール

(その1)で作成した仮想環境 venv-3 を利用することにして、ここに jupyter lab をインストールします。
【注】パッケージ名は「jupyterlab」、コマンド名は「jupyter lab」となるので注意

# 仮想環境 venv-3 起動
[python@^ ~]$ source venv-3/bin/activate

# jupyter lab のインストール
(venv-3) [python@^ ~]$ pip install jupyterlab
Collecting jupyterlab
  Downloading jupyterlab-3.1.9-py3-none-any.whl (8.5 MB)
     |????????????????????????????????| 8.5 MB 2.8 MB/s
Collecting jupyter-core
  Downloading jupyter_core-4.7.1-py3-none-any.whl (82 kB)
     |????????????????????????????????| 82 kB 2.4 MB/s
・・・・・・・・・
・・・(略)・・・ 

# jupyter lab の所在
(venv-3) [python@^ ~]$ which jupyter
~/venv-3/bin/jupyter

インストールは完了です。

設定ファイルの作成・修正

次に、jupyter lab の設定ファイル(jupyter_lab_config.py)を作成します。
以下のコマンドを実行することにより、ユーザーのホームディレクトリ(/home/python)に、.jupyter ディレクトリが追加され、その中に設定ファイルが作成されます。

# 設定ファイルの作成
(venv-3) [python@^ ~]$ jupyter lab --generate-config
Writing default config to: /home/python/.jupyter/jupyter_lab_config.py

# ホームディレクトリの確認
(venv-3) [python@^ ~]$ ls -la
合計 72
drwx------  12 python python 4096  8月 30 11:59 .
drwxr-xr-x.  4 root  root  4096  8月 30 09:55 ..
・・・・・・
drwx------   2 python python 4096  8月 30 11:59 .jupyter
・・・・・・

# 設定ファイルの確認
(venv-3) [python@^ ~]$ ls -la .jupyter
合計 44
drwx------  2 python python  4096  8月 30 11:59 .
drwx------ 12 python python  4096  8月 30 11:59 ..
-rw-rw-r--  1 python python 34318  8月 30 11:59 jupyter_lab_config.py

設定ファイルには、jupyter lab 起動のためのパスワードを設定する必要がありますが、ここでは、以下のコマンドで、ハッシュ化されたパスワードを作成することにします。コマンドを実行すると、.jupyter ディレクトリの json ファイル内にパスワードが作成されるので、コピーして設定ファイルに登録します。
-> パスワード(例):Password-Jlab-python とします。

# パスワードを作成
(venv-3) [python@^ ~]$ jupyter lab password
Enter password:   Password-Jlab-python
Verify password:  Password-Jlab-python
[JupyterPasswordApp] Wrote hashed password to /home/python/.jupyter/jupyter_server_config.json

# json ファイル内にパスワードが作成される(コピーしておく)
(venv-3) [python@^ ~]$ vi .jupyter/jupyter_server_config.json
---------------------------------------------------------------------
{
  "ServerApp": {
    "password": "argon2:$argon2id$v=19$m=10240,t=10,p=8$ayNbCppx+/img....."
  }
}
---------------------------------------------------------------------

設定ファイルを開き、以下の項目のコメントアウトを外し、書き換えます。
->jupyter lab を起動する際に使用するport番号(例):9999 とします。

(venv-3) [python@^ ~]$ vi .jupyter/jupyter_lab_config.py
--------------------------------------------------
c.ServerApp.ip = 'localhost'               # コメントアウトを外す
c.ServerApp.open_browser = False           #  同
c.ServerApp.port = 9999                    # c.ServerApp.port = 0
c.ServerApp.token = ''                     # c.ServerApp.token = '<generated>'
c.ServerApp.password = 'argon2:$argon2id$v=19$m=10240,t=10,p=8$ayNbCppx+/img.....'
--------------------------------------------------

設定が完了しました。

ここで予め、jupyter lab の作業場所(workspace)を作成しておきます。

(venv-3) [python@^ ~]$ mkdir workspace

jupyter lab の起動

ローカルPCからサーバー上の jupyter lab を 起動し、PCのブラウザから利用できるようにします。

まず、PCの「Windows PowerSheell」を起動して、サーバーにSSH接続します。その際に、以下のように、ローカルポートフォワードのオプションを設定します。

ssh -p <ssh接続 の port番号> -L <local の port番号(任意)>:localhost:<jupyter lab の port番号> <ユーザー名>@<サーバーIP または ドメイン名>)

->各項目の設定例
 ・ssh接続 の port番号(例):50000
 ・local の port番号(任意)(例):9999
 ・jupyter lab の port番号(例):9999
 ・ユーザー名(例):python
 ・サーバーIP または ドメイン名(例):example.net
 ・ユーザーパスワード(例):Password-OS-python とします。

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

# ssh接続し、パスワードを入力
PS C:\Users\user> ssh -p 50000 -L 9999:localhost:9999 python@example.net
python@example.net's password: Password-OS-python

SAKURA internet [Virtual Private Server SERVICE]

Last login: Mon Aug 30 17:47:10 2021 from 198.51.100.1

workspace に移動して、仮想環境を有効にした後、jupyter lab を起動します。

# workspaceディレクトリへ移動
[python@^ ~]$ cd workspace

# 仮想環境 venv-3 起動
[python@^ workspace]$ source ../venv-3/bin/activate

# jupyter lab 起動
(venv-3) [python@^ workspace]$ jupyter lab
[I 2021-08-30 20:28:24.901 ServerApp] jupyterlab | extension was successfully linked.
[I 2021-08-30 20:28:24.911 ServerApp] Writing Jupyter server cookie secret to /home/python/.local/share/jupyter/runtime/jupyter_cookie_secret
[I 2021-08-30 20:28:25.070 ServerApp] nbclassic | extension was successfully linked.
[I 2021-08-30 20:28:25.089 ServerApp] nbclassic | extension was successfully loaded.
[I 2021-08-30 20:28:25.090 LabApp] JupyterLab extension loaded from /home/python/venv-3/lib64/python3.8/site-packages/jupyterlab
[I 2021-08-30 20:28:25.090 LabApp] JupyterLab application directory is /home/python/venv-3/share/jupyter/lab
[I 2021-08-30 20:28:25.093 ServerApp] jupyterlab | extension was successfully loaded.
[I 2021-08-30 20:28:25.094 ServerApp] ローカルディレクトリからノートブックをサーブ: /home/python/workspace
[I 2021-08-30 20:28:25.094 ServerApp] Jupyter Server 1.10.2 is running at:
[I 2021-08-30 20:28:25.094 ServerApp] http://localhost:9999/lab
[I 2021-08-30 20:28:25.094 ServerApp]  or http://127.0.0.1:9999/lab
[I 2021-08-30 20:28:25.094 ServerApp] サーバを停止し全てのカーネルをシャットダウンするには Control-C を使って下さい(確認をスキップするには2回)。

PCのブラウザから http://localhost:9999/lab へアクセスします。

パスワード(ここでは、Password-Jlab-python)を入力してログインします。

Notebook の Python3 を選択して、pythonのバージョン、所在を確認してみます。

import sys
print(sys.version)
3.8.8 (default, Aug  2 2021, 14:57:02)
[GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]
print(sys.executable)
/home/python/venv-3/bin/python

仮想環境 venv-3 の python3.8 が起動していることが確認できました。

Kernel の追加

複数の仮想環境があるとき、仮想環境を切り替えて実行したいケースが出てくるときがあります。jyupyter lab を再度、実行したい仮想環境の下で起動し直してもよいですが、カーネルの切換で対応する手段もあります。

今の時点で、利用できるカーネルを確認してみます。

# 利用できるカーネルの確認
(venv-3) [python@^ ~]$ jupyter kernelspec list
Available kernels:
  python3    /home/python/venv-3/share/jupyter/kernels/python3

jupyter lab を起動した環境のみが登録されています(’python3’ は 現在の仮想環境=venv-3 の環境です)。この環境だけを使うのであれば、これで特に問題はありません。

仮想環境 venv-2(python3.6)も切り換えて使うようにしたい、というときは、予め、venv-2 に jupyter lab をインストールして、カーネルに追加しておきます。その手順は以下の通りです。(設定ファイルの修正等は不要です。)

# 仮想環境 venv-2 の起動
(venv-3) [python@^~]$ source venv-2/bin/activate

# jupyter lab インストール
(venv-2) [python@^ ~]$ pip install jupyterlab
・・・・・(略)

# venv-2をカーネルに追加
(venv-2) [python@^ ~]$ ipython kernel install --user --name=venv2 --display-name=python36-venv2
Installed kernelspec venv2 in /home/python/.local/share/jupyter/kernels/venv2

※カーネルに追加時のオプション:–name=<内部的に使用されるカーネルの名称> –display-name=<表示されるカーネルの名称>

あらためて利用できるカーネルを確認してみます。

(venv-2) [python@^ ~]$ jupyter kernelspec list
Available kernels:
  venv2      /home/python/.local/share/jupyter/kernels/venv2
  python3    /home/python/venv-2/share/jupyter/kernels/python3

venv-2 の環境が、カーネルに追加されました。’python3′ は、今度は、現在の仮想環境=venv-2 の環境になってしまいましたので、venv-3 の環境も明示的にカーネルに追加しておくことにします。

# 仮想環境 venv-3 の起動
(venv-2) [python@^ ~]$ source venv-3/bin/activate

# venv-3 をカーネルに追加
(venv-3) [python@^ ~]$ ipython kernel install --user --name=venv3 --
display-name=python38-venv3
Installed kernelspec venv3 in /home/python/.local/share/jupyter/kernels/venv3

もう一度、利用できるカーネルを確認してみます。

(venv-3) [python@^ ~]$ jupyter kernelspec list
Available kernels:
  venv2      /home/python/.local/share/jupyter/kernels/venv2
  venv3      /home/python/.local/share/jupyter/kernels/venv3
  python3    /home/python/venv-3/share/jupyter/kernels/python3

再びローカルPC から venv-3 環境で jupyter lab を起動し、ブラウザで確認してみます。

メニュー kernel タグの「Change Kernel…」項を選択すると、Kernel が追加されていることがわかります。’Python3′ は、jupyter を立ち上げた環境(ここではvenv-3=python3.8)です。

カーネルを切り換えることで、別の仮想環境が使えるようになりました。

Kernelの削除

カーネルを削除したいときは、

$ jupyter kernelspec uninstall <kernelの名前>

とします。<kernelの名前> は、作成のときに –name= で指定した名称になります。

Pythonの実行ファイル(.py)の作成と実行

.py の作成

jupyter lab で作成した Notebook を python の実行ファイル(.py)にする方法についてのメモです。

例えば、次のような Notebook が test.ipynb という名称で保存してあるとき、

これを python の実行ファイルにする方法の一つは、メニューの
  File > Export Notebook As … > Executable Script
により、エクスポートすること。ただし、この方法だと .py ファイルがローカルPCにダウンロードされるため、サーバーに戻してやらなくてはいけません。

サーバー内で処理を完結するには、jupyter lab 上で次のコマンドを実行します。

!jupyter nbconvert --to python test.ipynb
[NbConvertApp] Converting notebook test.ipynb to python
[NbConvertApp] Writing 251 bytes to test.py

これを実行することで、test.ipynb と同じディレクトリに test.py が作成されます。
test.py には、次のように記述されます。

#!/usr/bin/env python
# coding: utf-8

# In[1]:

import sys
print(sys.version)

# In[2]:

print(sys.executable)

# In[3]:

import numpy as np
a = np.array([1, 2, 3])
print(a)

# In[ ]:

#! から始まる1行目は「shebang」と呼ばれ、「実行時のインタプリタを指定するもの」ですが、test.py を python コマンドを使って実行する限り(test.py をコマンドとして実行するのではない限り)、記述する必然性はありません。

.py の実行

jupyter lab 上で実行

test.py を jupyter lab 上で実行するときは、セルに次のコマンドを入力します。

%run test.py
3.8.12 (default, Sep 21 2021, 00:10:52) 
[GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]
/home/python/venv-3/bin/python
[1 2 3]

numpy は仮想環境 venv-3 のみにインストールしているので、カーネルを変更して(例えば venv-2)実行すると、エラーになります。

pythonコマンドで実行

SSH接続したターミナル上で実行する場合は、仮想環境を有効にした上で実行します。

[python@^ ~]$ cd workspace

[python@^ workspace]$ source ../venv-3/bin/activate

(venv-3) [python@^ workspace]$ python test.py
3.8.12 (default, Sep 21 2021, 00:10:52)
[GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]
/home/python/venv-3/bin/python
[1 2 3]

この場合も、numpy をインストールしていない環境で実行するとエラーになります。

.py をコマンドとして実行

次に、test.py をコマンドとして実行します(python コマンドを使わない)。コマンドとして実行するには、test.py 実行権限を付与する必要があります。例えば、今のまま実行すると、

(venv-3) [python@^ workspace]$ ./test.py
bash: ./test.py: 許可がありません

※「 ./ 」を付けて実行していることに注意。付けないと「bash: test.py: コマンドが見つかりません」となる。

と指摘されるので、実行権限を付与してもう一度実行してみます。

(venv-3) [python@^ workspace]$ chmod 777 test.py

(venv-3) [python@^ workspace]$ ./test.py
3.8.12 (default, Sep 21 2021, 00:10:52)
[GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]
/home/python/venv-3/bin/python
[1 2 3]

うまくいきました。ここでも、numpy がインストールされていない環境で実行するとエラーになります。試しに、仮想環境venv-3 を終了した環境で実行してみます。

(venv-3) [python@^ workspace]$ deactivate

[python@^ workspace]$ ./test.py
3.8.12 (default, Sep 21 2021, 00:10:52)
[GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]
/usr/bin/python3.8
Traceback (most recent call last):
  File "./test.py", line 20, in <module>
    import numpy as np
ModuleNotFoundError: No module named 'numpy'

test.py をコマンドとして実行する場合は「shebang」の記載が重要となり、この場合も以下のように実行する環境を特定しておけば、エラーとはなりません。

#!/home/python/venv-3/bin/python

参考

SSH先のサーバ上のnotebookをローカルPCで操作する
Jupyterで複数カーネルを簡単に選択するための設定
Jupyter Notebook のカーネルに仮想環境をセットする方法
手を動かして理解するshebang



タイトルとURLをコピーしました