しばしばプログラミングに立ちはだかる壁が「環境に関する問題」です。

コードを書きたいのに、環境にばかり時間をとられてしまう。インストールした当初は問題がなかったのに、いつの間にかいろいろと支障が生じてきた。…こんな環境にまつわる悩みは、多くの方が経験したことがあるはずです。

Pythonの場合、そんな悩みの解決策の1つが「Google Colaboratory(略称: Colab)」を使うことです。Googleがクラウド上に準備してくれている環境なので、自分で構築したりメンテナンスする必要がありません。Googleアカウントがあれば、ブラウザですぐに無料で利用できて非常に便利ですが、どうしてもデータはクラウドに置くことになります。それが気になる場合もあると思います。

では、Google Colabのような環境をUSBメモリの中に構築できたらどうでしょうか。そうすれば、会社でも自宅でも同じ環境が使えて、データをクラウドにアップする必要もなくなります。

そこで今回はUSBの中だけでPython + JupyterLabを実行できる環境を作る方法をご紹介します。これで、パソコンにPythonをインストールしなくてもUSBメモリを挿し込むだけでいつも同じ環境を利用できるようになります。

環境をUSBメモリに入れて持ち運べるだけでなく、講習やデモでUSBを渡してあげればPythonをインストールしないですぐにはじめることができます。ぜひ様々なケースでご活用ください。

このように環境をカプセル化するには、他にも仮想環境やコンテナ技術を利用する方法があります。特に最近ではDocker (ドッカー)と呼ばれるコンテナ型の仮想化環境が人気です。また、WinPython というはじめからUSBメモリでPythonを使えるディストリビューションもあります。今回は、公式サイトから入手できるPythonパッケージを用いて自分で構築する方法を説明します。これにより、Pythonで書いたプログラムを配布するときなど様々に応用できるようになります。
本記事の目次

本記事はWindows限定です

今回利用する「埋め込み可能なPythonパッケージ」は、Windows版しかリリースされていないため、残念ながらMacやLinuxでは本記事の方法を用いることができません。

構築する環境

今回は、Pythonをインストールしていないパソコンでも、USBメモリがあれば「JupyterLab」でPythonが使える環境を構築します。

Jupyterlabは、Webブラウザに表示された画面で、プログラミングができるようにしてくれるライブラリです。結果やグラフもそのままWebブラウザに表示されるため、試行錯誤しながらのプログラミングに向いています。そのため、データ分析でよく用いられています。また、ノートに書き込む感覚で使えるのでPythonの学習用としてもおすすめです。

なお、Google Colabは、従来の「Jupyter Notebook」をベースにしていますが、JupyterLabはその後継にあたります。複数のタブを開けるなど新機能が加わりさらに使いやすくなっています。

今回の方法でJupyter Notebookを使うように変更することもできます。詳しくはこちらをご覧ください。

構築の手順

  1. 作業用フォルダーを準備する
  2. Pythonをダウンロードして配置する
  3. pipを使えるようにする
  4. ライブラリをインストールする
  5. 起動用バッチファイルを作成する
  6. 起動してみる
  7. USBにコピーする

1. 作業用フォルダーを準備する

パソコンの「ドキュメント」フォルダーに、作業用のフォルダー「PythonUSB」という名前で作成しておきます。さらにその中に「Notebook」と「Python」という2つのフォルダーを以下のように作成します。

  ├ ドキュメント/
  │    ├ PythonUSB/     <= 作業用フォルダー
  │    │    ├ Notebook/
  │    │    └ Python/
  │    │
  • PythonやJupyterLabの実行環境は「Python」フォルダーに構築します。
  • 「Notebook」フォルダーは、プログラムコードのデフォルトの保存先として作成しておきます。JupyterLabを起動するとこのフォルダーの中身が左側のサイドバーに表示されます

作業が完了したら、最後に「PythonUSB」フォルダーごとUSBメモリーにコピーして稼働させます。

JupyterLabではPythonファイル(*.py)ではなくノートブック形式(*.ipynb)

JupyterLabやJupyter Notebookでは、プログラムコードはPythonファイル(*.py)ではなくノートブックと呼ばれる形式(*.ipynb)で保存されます。

2. Pythonをダウンロードして配置する

WindowsにPythonをインストールするときに用いるパッケージには、以下の4種類があります。

  • 完全版インストーラ(一般的なWindowsインストーラ)
  • 埋め込み可能なパッケージ今回はこれを用います
  • Microsoftストアパッケージ
  • nuget.org パッケージ

一般に用いられるのは「完全版インストーラー」ですが、今回は「埋め込み可能なパッケージ」を用います。Pythonをインストールしていないユーザーにプログラムを配布するときなどに使われます。

Pythonを実行するのに必要なファイル一式がまとめられているので、このパッケージを利用すればパソコンにインストールされている他のシステムとは独立した環境を構築できます。

(1) Pythonの公式サイトからダウンロードする

埋め込み可能なパッケージをダウンロードするには、まずPythonの公式サイトのダウンロードページにアクセスして、以下のような最新のバージョンの「Downloads」のリンクをクリックします(記事執筆時点の最新は3.9.1)。

Pythonダウンロードのページ

python download page top

するとバージョンごとのダウンロードページが表示されます。下のほうにある以下のような「Files」のWindows embeddable package」が埋め込み可能なパッケージです。

python downloads

32-bitと64bitの2種類がありますが、今回は32-bitのほうをクリックしてダウンロードします(64-bitマシンのみを使う場合は64-bitでも大丈夫です)。

今回はPython3.9.1で構築しています

今回は以下のページからPython3.9.1をダウンロードして構築します。最新のバージョンに適宜読み替えてください。

https://www.python.org/downloads/release/python-391/

(2) 展開してPythonフォルダに配置する

ダウンロードしたファイルはpython-3.9.1-embed-win32.zipのようなZIP形式になっています。展開してフォルダごと以下のように「Python」フォルダーの下に入れます。

  ├ ドキュメント/
  │    ├ PythonUSB/
  │    │    ├ Notebook/
  │    │    └ Python/
  │    │        └ python-3.9.1/  <= 展開して配置したパッケージ

このときフォルダー名は「python-3.9.1-embed-win32」から「python-3.9.1」に短く変更しておきます。

3. pipを使えるようにする

JupyterLabをはじめとするライブラリをインストールするには「pip」と呼ばれるツールが必要ですが、埋め込み可能なパッケージのPythonには「pip」は含まれません。そこで、「pip」が使えるように、以下の方法により手動でインストールします。

(1) python39._pthの編集

先ほど配置した「python-3.9.1」フォルダーの中にあるファイルpython39._pthメモ帳で開き、以下のように#import siteの先頭の#を削除(コメントアウトを解除)し上書き保存します。

_path file edit

import siteを有効にすることで、Python起動時にsite.main()が実行され、ライブラリの保管場所(site-packagesフォルダー)がパスに追加されるようになります。

(2) get-pip.pyのダウンロード

以下のリンクからpipインストール用のコードget-pip.pyをダウンロードし「python-3.9.1」フォルダーに保存します。ダウンロードはリンクを右クリックしたメニューから保存できます。

https://bootstrap.pypa.io/get-pip.py

(3) get-pip.pyを実行してpipをインストールする

get-pip.pyをコマンドプロンプトを用いてPythonで実行してpipをインストールします。

作業は「python-3.9.1フォルダー」で行うので、以下のようにエクスプローラーでこのフォルダーを選択した状態でボックスにcmdを入力実行してコマンドプロンプトを起動します。

get-pip.py download

コマンドプロンプトが起動したら以下のコマンドを入力して実行します。

python.exe get-pip.py

以下のように「Successfully installed pip ~」と表示されればpipのインストールは成功です。茶色いWARNINGはここでは気にしないで大丈夫です(指摘されているパスは、後ほどバッチファイルで対応します)。

get-pip.py execute

python get-pip.pyと入力しても同じく実行できますが、本記事ではpython.exeと明示的に入力しています。

4. ライブラリをインストールする

これで「pip」が使えるようになったので、JupyterLabをはじめてとするライブラリをインストールします。

(1) JupyterLabのインストール

さきほどpipをインストールしたコマンドプロンプトに以下のコマンドを入力して実行すると「JupyterLab 」のインストールが開始されます。

python.exe -m pip install jupyterlab

pip install jupyterlab

JupyterLab自体が使用する多数のライブラリも一緒にインストールするので、しばらく完了するまで待ちます。以下のように「Successfully installed ~」と表示されれば完了です。

pip installed jupyterlab

pipをインストールしたときと同じく茶色いWARNINGが表示されますが、指摘されているパスは、後ほどバッチファイルで対応しますのでここでは気にしないで大丈夫です。

(2) 他のライブラリのインストール

ついでによく用いるライブラリをインストールしておきます。今回は、「openpyxl 」、「beautifulsoup4 」、「numpy 」、「pandas 」、「matplotlib 」、「japanize-matplotlib 」、「seaborn 」の7つのライブラリをインストールします。

JupyterLabのインストールの後に、続けて以下のコマンドをコマンドプロンプトで実行します。

python.exe -m pip install openpyxl
python.exe -m pip install beautiflsoup4
python.exe -m pip install numpy
python.exe -m pip install pandas
python.exe -m pip install matplotlib
python.exe -m pip install japanize-matplotlib
python.exe -m pip install seaborn

なお、この方法で後からいつでもインストールできるので、ここでは必要なライブラリだけにしておいても大丈夫です。

他に「requests 」と「scipy 」も必要になることがあると思いますが、それぞれJupyterLabとseabornと一緒にインストールされるので、別途インストールしないでも使用できます。

(3) jediのアンインストール

最後に以下のコマンドをコマンドプロンプトで実行して、「jedi」というライブラリをアンインストールします。このライブラリがあると「JupyterLabのコード補完機能」が競合して作動しないので、ここでアンインストールしておきます。

python.exe -m pip uninstall jedi

アンインストールの途中で「Proceed (y/n)?」と表示されたら以下のように「y」を入力します。

pip uninstall jedi

JupyterLabのコード補完機能とは

JupyterLabでは入力の途中でTABキーを押すと以下のように候補が表示されます。

JupyterLab Autocomp

5. 起動用バッチファイルと設定ファイルを作成する

JupyterLab起動用のバッチファイルstart-jupyterlab.bat)とJupyterLabの設定ファイルjupyterlab_settings.py)を「PythonUSB」の中に配置します。

  ├ ドキュメント/
  │    ├ PythonUSB/
  │    │    ├ Notebook/
  │    │    ├ Python/
  │    │    ├ jupyter_notebook_config.py  <= 設定ファイル
  │    │    └ start-jupyterlab.bat        <= 起動用バッチファイル
  │    │        

この2つのファイルは以下のリンクからダウンロードできるようにしてありますので、ご利用ください。

start-jupyterlab.zip

ファイルの内容は以下の通りです。

起動用バッチファイル

start-jupyterlab.bat
@echo off
set cwdirpath=%~dp0
set pyintpath=%cwdirpath%Python¥python-3.9.1¥
set notebpath=%cwdirpath%Notebook¥
set usrpfpath=%cwdirpath%_user_profile¥

set PYTHONHOME=
set PYTHONPATH=
set JUPYTER_CONFIG_DIR=%usrpfpath%jupyter
set IPYTHONDIR=%usrpfpath%ipython
set MPLCONFIGDIR=%usrpfpath%matplotlib
set LOCALAPPDATA=%usrpfpath%appdata¥Local
set APPDATA=%usrpfpath%appdata¥Roaming

set PATH=%PATH%;%pyintpath%;%pyintpath%Scripts¥
cd /d %notebpath%

echo JupyterLabを起動中です。このウィンドウは閉じないでください。JupyterLabの「File」メニューから「ShutDown」を選択すると自動で閉じます。

call %pyintpath%pythonw.exe %pyintpath%Scripts¥jupyter-lab.exe ^
--config=%cwdirpath%jupyter_notebook_config.py ^
--LabApp.user_settings_dir=%usrpfpath%jupyterlab¥lab¥user-settings ^
--LabApp.workspaces_dir=%usrpfpath%jupyterlab¥lab¥workspaces
  • %~dp0はバッチファイルでよく用いられます。実行されているディレクトリのパスを取得できます。ここでは、このバッチファイルがある「PythonUSB」フォルダーのパスになります。
  • python-3.9.1の部分は、ダウンロードしたPythonのバージョンに応じて変更してください(たとえば、Python 3.11.2の場合はpython-3.11.2)。
  • JupyterLabを起動するとWebブラウザや各種ライブラリのプロファイルが生成されます。それらは通常パソコンのユーザープロファイルフォルダーに保存されますが、今回はこれらもUSBに保存されるようにします。そのため、プロファイルの保存先を指定する「APPDATA」などの環境変数を、setコマンドで一時的に「PythonUSB」フォルダの下の「_user_profile」フォルダーを示すように書き換えています。
  • JupyterLabを起動するのにpython.exeではなくpythonw.exeを用いることで、起動中のメッセージを非表示にしています(python.exeに書き換えれば表示するようにできます)。
  • 設定ファイルのjupyter_notebook_config.pyもUSBから読み込むように、jupyter-lab.exeを実行するときに--configオプションにより「PythonUSB」フォルダーに指定しています。
JupyterLabでなく「Jupyter Notebook」を使いたい場合

従来からの「Jupyter Notebook」の方を使いたい場合は、以下のようにバッチファイルのjupyter-lab.exeの部分をjupyter-notebook.exeに書き換えるだけです。これでこのバッチファイルを実行するとJupyter Notebookが起動するようになります。

...
call %pyintpath%pythonw.exe %pyintpath%Scripts¥jupyter-notebook.exe ^
--config=%cwdirpath%jupyter_notebook_config.py ^
--LabApp.user_settings_dir=%usrpfpath%jupyterlab¥lab¥user-settings ^
--LabApp.workspaces_dir=%usrpfpath%jupyterlab¥lab¥workspaces

設定ファイル

jupyter_notebook_config.py
...
# 814行目だけコメントアウトを解除して値を「1」にしてある。
c.ServerApp.webbrowser_open_new = 1
...
  • このファイルを編集すれば、JupyterLabの設定を変更できます。デフォルトでは831行すべてがコメントアウトされており、そのままだとデフォルトの設定になります。
  • 今回は814行目だけコメントアウトを解除して、値を「1」に変更してあります。こうすることでブラウザが新しいタブではなく「新しいウィンドウ」で開くようになります(ただし反映されない場合もあります)。
ブラウザをChromeに変更したい場合

JupyterLabを起動すると自動的にデフォルトのブラウザが選択されます。今回の例ではMicrosoft Edgeが起動していますが、これをいつもChromeブラウザが開くように変更するには、jupyter_notebook_config.pyの末尾に以下のコードを書き加えてください。

# jupyter_notebook_config.pyに以下のコードを追加
import os.path
import webbrowser

chrome_exe = "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
if os.path.isfile(chrome_exe):
    webbrowser.register("chrome", None, webbrowser.GenericBrowser(chrome_exe))
    c.NotebookApp.browser = "chrome"

6. 起動してみる

USBにコピーする前に「ドキュメント」フォルダーにある状態で起動してみます。以下のようにエクスプローラーでstart-jupyterlab.batをダブルクリックします。

start jupyterlab

すると以下のようにコマンドプロンプトに続いてデフォルトのブラウザが自動的に起動します。

start jupyterlab cmd

しばらく待つと以下のようにJupyterLabの画面が表示されますので、以下のようにNotebookのところの「Python3」をクリックしてみます。

jupyter notebook create

すると「Untitled.ipynb」という新規のタブが開くので、以下のコードを入力して簡単なプログラム(コサインカーブの描画)を実行してみましょう。

セルにコードを入力したら、Shift + Enter でコードを実行できます。

%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.cos(x)
plt.plot(x, y)

コードを実行すると以下のようにコサインカーブ(余弦波)が表示されます。

cos curve

なお、ここで「Matplotlib is building the font cache; this may take a moment.」と表示されているのは、Matplotlibがフォントのキャッシュファイルを出力しているので、しばらく待つよう知らせています。次回からこのメッセージは表示されません。

これで起動の確認ができたので、終了します。終了は、「File」メニュー ▶「Shut down」を選択します。以下のようなダイアログが表示されるので、「Shut Down」をクリックします。

jupyterlab shut down

以下のように「Sever stopped」と表示されたら(このときコマンドプロンプトは自動で閉じられます)、ブラウザを閉じて終了させます。

server stopped

ファイルは「Notebook」フォルダーに保存されます

前述のstart-jupyterlab.batでカレントを「PythonUSB」フォルダーにある「Notebook」フォルダーに設定しているので、このフォルダーがJupyterLabの作業フォルダーになります。今回作成した「Untitled.ipynb」ファイルは、この「Notebook」フォルダーに自動保存されます。

また、JupyterLabを起動すると以下のように「Notebook」フォルダーの中身が左側のサイドバーに表示されるので、講習やデモではサンプルをこの「Notebook」フォルダーの中に入れて配布するとわかりやすくなります。

jupyterlab left sidebar

ファイル名を変更するには?

ファイル名を変更するには、JupyterLabの左側でファイルを右クリックで表示されるメニューから「Rename」を選択して新しいファイル名を入力します。

7. USBにコピーする

あとは「PythonUSB」フォルダーをUSBにコピーするだけですが、「_user_profile」フォルダーには先ほど試しに起動したときのWebブラウザなどのプロファイルが保存されてるので、以下のように削除してからUSBにコピーします。

copy to usb

なお、この「PythonUSB」フォルダーの容量は以下のように400MB程度ですが、起動するとプロファイルが100MB程度は生成されますので、運用するには1GB以上は空き容量を確保しておくのが望ましいです。

pythonusb folder info

ファイル数が約18,000もあるので、コピーは少し時間がかかります(複数のUSBメモリにコピーする場合などは、ZIP形式に圧縮してからコピーして展開すると時間を短縮できます)。

コピーが完了したら、使用するパソコンにUSBを差し込んで、前述と同様にstart-jupyterlab.batをダブルクリックするとJupyterLabが起動します。

launch jupyterlab

初回はプロファイルを書き込むため少し起動に時間がかかりますが、次回からはスムーズに起動するようになります。弊社でモバイル用に使用しているASUS E203MA(Celeron N4000)では2回目以降は10秒程度で起動しています。

asus E203M

最後に(留意すること)

今回の方法で構築した環境を使うときには、以下の2つに気を付けてください。特にUSBメモリのアクセス速度はとても大事です。低速のUSBメモリだと快適に使うことができません。

読み書きスピードが高速のUSBメモリを使用する

JupyterLabは非常に多くのファイルを用いますので、読み書きスピードが遅いUSBメモリだと実用性に乏しくなります。パソコンのインターフェイスはUSB 3.1以上の規格、USBメモリは以下のような高速のもの(またはSSD)を使うようにするのがポイントです。

「Notebook」フォルダーはこまめにバックアップをとる

あくまでもUSBメモリなので、コードやデータは忘れないでバックアップをとっておくことが必要です。今回の構成では、「Notebook」フォルダーにコードが保存されるので、このフォルダーはこまめにバックアップをとるようにします。

今回の記事には、Pythonの環境構築に関する様々なエッセンスが含まれています。ぜひ他にもいろいろと調べながら、自分が使いやすい環境を構築してみてください。