Pythonプログラムの軽量な配布方法 – Embeddable の手順

Pythonで開発したプログラムをユーザーに配布する場合、Pythonに馴染みがなくともエンジニアであれば3つの方法が思いつくと思います。1つ目はユーザーの環境にPythonの環境を導入する方法、2番目の方法はWebアプリ化する方法(バックエンドでPythonを動かす)、3つ目の方法はネイティブアプリ化する方法です(Windowsであればexe化)。1つ目の方法のデメリットは言うまでもなく、ユーザーがWindowsの場合は環境構築コストが高いこと(あるいはセットアップのプログラムを別途用意必要があること)、バージョン管理が煩雑になることです。2つ目の方法はフロントエンドの構築コストとサーバーを維持するコストがデメリットです。3つ目の方法は一見優れているように思われますが、私の経験上pythonのexe化はどのソフトを使っても遅く、ファイルも重くなる傾向があります。本稿では、pythonの公式で配布されているpython embeddableファイルを使った方法をご紹介します。この方法でユーザーに配布すると上記のデメリットが全て解消されます。すなわち、ユーザー側での環境構築が不要、サーバー不要、exe化不要でPythonコードを配布できます(デメリットについては本文で紹介)。

本稿で使用した環境:

  • Windows 10 64bit
  • Anaconda client version 1.7.2
  • Python 3.6.5 64bit(グローバル)
  • Python 3.8.6(Conda仮想環境 – 開発環境)
  • Python 3.8.6(embeddableのバージョン)

本稿で紹介する方法は、上記の環境で動作確認をしましたが、本文中の画像は別の環境(本ブログを執筆しているPC)から取得しているため、pythonのバージョンの表示等が上記とは異なることがあります。

開発環境

Python embeddableを利用してユーザーにプログラムを配布する場合、Conda仮想環境での開発をお勧めいたします。Conda仮想環境のメリットは、Pythonのバージョンとライブラリーが一体で管理・仮想化される点と、後述の方法でpython embeddableに開発環境のライブラリーをそのままコピーできる点です。もちろん他の仮想環境による開発でも、pythonのバージョンとライブラリーをぴったしに揃えている限り問題はありませんが、後述2つ目の方法によるライブラリーのインストールは未検証です。

Python embeddableをダウンロードする前の確認事項

Python embeddableのダウンロードをする前に、python embeddableのbit数を決めます。

python embeddableには32bit版と64bit版があります。(1)開発環境Windowsのbit数、(2)Pythonプログラムを納入するユーザーのWindowsのbit数、(3)開発環境のPythonのbit数、以上全て32bitか64bitのいずれかで揃っているのであれば問題ないですが、この3社がずれている場合が悩ましいです。私は開発環境のPythonのbit数を基本としつつも、64bitと32bitの両方のpython embeddableを作成してユーザー環境でテストします。私の経験上、プログラムがうまく動作しない場合は両者で挙動が異なります。なお、64bitのOS上で32bitのアプリケーションが動いていること自体はよくあります。

Pythonのbit数の確認方法

Anaconda prompt(又はCommand prompt)を開いて、pythonの対話モードを起動し、下記のコードを入力します。

import platform
platform.architecture()

結果は例えば下記のようになります。(’64bit’, ‘WindowsPE’)とあるので、本事例の場合は64bitのPythonです。2行目のAnaconda, Inc, on win32の32の部分は、32bitでも64bitでもWindows10である限りwin32と表示されるので気にしないでください。


Pythonのbit数の確認方法

Windowsのbit数の確認方法(Windows10の場合)

Windowsボタン(スタートボタン)から歯車の設定(setting)をクリック、続いて、システム(System)、バージョン情報(about)をクリックすると、右側にデバイスの仕様(Device specifications)が表示されます。システムの種類(System type)の部分でWindowsのbit数を確認できます。下記の例では、64-bitのWindowsであることがわかります。


Windowsのbit数の確認方法

Embeddable zipのダウンロード

Python.orgのホームページより、開発環境で使用したpythonと同じバージョンのpythonのダウンロードページ(https://www.python.org/downloads/)に飛びます。下記はpython3.8.6のダウンロードの画面です。2つembeddable zipファイルが確認できると思いますが、ファイル名に数字の「64」を含むのが64bit版、そうでない方が32bit版のembeddable zipファイルです。クリックするとダウンロードできます。


download python embeddable zip

ダウンロード後に配布用にライブラリーのインストールを行います。私の経験上パスに平仮名が入るとライブラリーのダウンロードができないので、平仮名を含まないパスを持つディレクトリーに上記embeddable zipファイルを展開(解凍)します。

python3X._pthのファイルの修正

Python embeddableに追加のライブラリーをインストールする方法は2つあります。1つ目はget-pip.pyを使ってpip installする方法、2つ目はConda仮想環境からScriptsフォルダを全てコピーしてpython embeddableファイルに移管する方法です。いずれの方法でも、まずpython3X._pthというファイルをエディター(メモ帳でも可)で修正します。Xの部分はインストールするpythonのバージョンによって変わります。


python embeddable python38._pth file

1つ目のget-pip.pyを使ってpip installする方法では、import siteのコメントアウトをとるだけで修正が終わります。2つ目の方法による場合は追加の記載が必要です(後ほどご紹介します)。下記はimport siteのコメントアウトはとった状態です。1行目のpython38.zipの部分はpython embeddableのパッケージによって異なりますのでコピーされる際はご注意ください。

python38._pth

python38.zip
.

# Uncomment to run site.main() automatically
import site

ライブラリーのインストール – 1つ目の方法

1つ目の方法は多くのサイト・ブログで紹介されている方法です。get-pip.pyをこちら:https://bootstrap.pypa.io/get-pip.pyからダウンロードし、python embeddableのフォルダに配置します。cmdでもanacondaでもいいので、グローバルでpythonが動くCLIで下記のコマンドでembedのフォルダにcdで移動の上、下記のコマンドを実行します。python embeddableはユーザー側ではPythonのインストール不要ですが、配布用のpython embeddableを用意する側の開発環境では、グローバルにpythonをインストールする必要があります。

python.exe get-pip.py

Successfully installed pip-22.2.2 setuptools-65.2.0 wheel-0.37.1と表示されれば成功です(数字の部分はバージョンによって異なる)。embedフォルダに戻ると、新たにLibフォルダとScriptsフォルダが作成され(下記参照)、Scriptsの中にpip.exeが作成されたことを確認できます。以降、embedフォルダのパスを変更するとワークしないので、フォルダ名の変更やフォルダそのものを移動させないでください。


python embeddable

具体的なライブラリーのインストール方法(1つ目の方法による場合)

Scriptsフォルダに移動し、下記コマンドにてライブラリーをインストールします。[pkgname]の部分は、インストールするライブラリーを入れてください。

pip.exe install [pkgname]

グローバルのパスの状況によっては、pip.exeがグローバルのパスにかかり、グローバルにインストールされる可能性があります(Libフォルダの内側にインストールされない)。その場合はpip.exeをルートアドレスからのパスを指定して実行することで、Scriptsフォルダ内のpip.exeを実行できます。この場合、pip.exe install [pkgname]コマンドは、例えば下記のようになります:

C:\Python\python-3.8.6-embed-win32\Scripts\pip.exe install [pkgname]

WindowsのPowershell上では下記のようになります。msoffcrypto-toolはライブラリーの例です。


python embeddable install libraries

ライブラリーのインストール – 2つ目の方法

2つ目の方法は、ライブラリーを一つずつインストールせずに、開発環境のLibフォルダをそのまま全部文字通りコピーして貼り付けるという方法です。Stack overflowのこちら「Adding packages to Python “embedded” installation for Windows」の回答からヒントを得ました。Stackoverflowの方法は仮想環境を前提としていませんが、本稿記載の方法(Conda仮想環境)は動作確認がとれています。グローバルのPython開発環境は往々にして様々なライブラリーがインストールされ重くなっています。仮想環境であれば、配布用にインストールするライブラリーを最小限にできます。また、pythonのバージョンをぴったしに揃えるためにも仮想環境を使います。Conda以外の仮想環境でワークするかどうかは未検証です。

まずはConda仮想環境を作ります(Conda仮想環境は私のこちらのQittaの記事でも詳しく解説しています)。Python embeddableとCondaのpythonのバージョンをぴったしに合わせることと、全体を軽くしたいので、Conda仮想環境ではライブラリーのインストールを最小限としておくことがポイントです。

Conda仮想環境で必要なライブラリーをインストールした後、同仮想環境内でライブラリーがインストールされているLibフォルダ、具体的にはAnaconda3/envs/<仮想環境名>/Libのフォルダを探します。Minicondaの方は、Miniconda3/envs/<仮想環境名>/Libです。Anaconda3、Minicoda3自体は、C:/ProgramDataなどに入っていると思います。このLibフォルダ自体を全てコピーし、embedフォルダの内側に貼り付けます。

Libフォルダを貼り付けた後、embedフォルダの直下にあるpython3X._pthファイルをエディターで開き、LibとLib\site-packagesを書き加えます。

python38._pth

python38.zip
.

# Uncomment to run site.main() automatically
import site
Lib
Lib\site-packages

Python embeddableのデメリット

本稿でご紹介したいずれの方法によってもインストールできないライブラリーが存在します。その場合はpython embeddableによる配布を断念し、他の方法を検討します。

Pythonプログラムの実行方法

作成したpythonのプログラム(.pyファイル)をembedフォルダ内に配置します。続いてbatファイルを作成し、下記のように入力します。黒いcmdの画面が不要な場合はpauseをとります。

python38._pth

python.exe .py
pause

ユーザーへの配布方法・実行方法

ユーザーには、zipファイルにして配布後、Cドライブなどのローカルドライブに解凍・配置してもらいます。次に上記batファイルのショートカットを作成、同ショートカットをデスクトップに置き、同ショートカットをクリックすることでPythonプログラムを実行できます。

今日も最後まで読んで頂きありがとうございました。