Download Embeddable Python and Install the library

「埋め込み用Pythonのダウンロードとライブラリのインストール方法」

1.始めに
2.Embeddable Python をダウンロード
3.必要なライブラリをインストールする準備
4.Numpyのインストール
5.OpenCVのインストール
6.単体で動作確認(検証)
7.まとめ
8.お願いとお断り

1.始めに

なぜ、Embeddable(埋め込み用)なのかというと、内部的なデータ処理にPythonのOpenCV & Numpyライブラリを使うと、アプリケーションをより一層高速化できることがわかったから。
それから、Python環境のアップデートとは関係なく、安定動作する実行環境を、PCの操作にあまり詳しくないユーザーに提供できるから。

重要

このような特殊な目的ではなく、学習用にPythonを導入したい場合は、埋め込み用途に配布されている Embeddable Python はお勧めできません! 普通にインストーラを使用して、普通のPython環境をPCにセットアップしてください。

もし、PC環境を変更せずに、(持ち運びも可能な)Pythonが実行できる環境を作りたい場合は、WinPythonが便利! WinPythonならUSBメモリやSDカードにセットアップして、PC環境に変更を加えずに利用可能。なお、この場合は・・・

スタートボタン → 設定 → アプリ → アプリと機能 → その他の設定 → アプリ実行エイリアス → アプリ インストーラー(項目のいちばん下)のPythonとPython3をオフ

・・・にしてから、外部メディアにセットアップしたWinPythonを実行。

WinPythonのDL先URL:https://winpython.github.io/

WinPythonを外部メディアに入れて利用する場合

2.Embeddable Python をダウンロード

Embeddable Python は https://www.python.org/downloads/windows/ からダウンロード可能。

上記のサイトに行くと、古い2.X.Xから最新版の3.11.0(テスト用)まで、これまでにリリースされた Embeddable Python すべてがある。どれを選んでよいか、困ってしまう(実際、困った)。だから、使用目的(& 条件)に合わせてダウンロードする Embeddable Python を選択しなければならない。

私の場合、まず Stable Release (安定動作版:様々な動作検証がそれなりに行われたバージョンってこと?)であること。さらに、数値演算用のNumpyライブラリと、コンピュータの眼として利用する画像処理用のOpenCVがインストールできること。最低限、この3つを満たしていればOK!だ。

それから、32 or 64bitバージョンのどちらを選択するか、ちょっと迷ったが、よく考えたら(私が)、Delphi11で設定しているVCLのターゲットプラットフォームは32bitアプリケーション。だから32bitバージョンを選択すべきだと気付く。

ターゲットプラットフォームの設定はWindows32ビット(私の場合)

あとは・・・新しいのか、ちょっと前のか、すごく古いのか、どれを選べばいいんだろー??? 2.X.Xはもう既にサポートがないから、3.X.X なのは絶対だけど。。。3.6.X? 3.7.X? 3.8.X? それとも3.9.X? 最新版は3.10.1があるけどー。

うー。うーー。うーーー。(悩む私)

※ 実はマイナーバージョンごとの違いすらまったくわかってない。

たぶん(根拠無し)、最新版でいいだろー☆(←完全な思い込み)

単純極まりない私は、Stable Release のいちばん上にある

「Win7より前のOSには使えません」・・・って注意書きしかないし、この時点での私はNumpyが3.10.1に非対応(2021年12月現在)だということを、誰も教えてくれないから当然知らない(調べろ!)し、なにより、普通の人(?)は、最新版が取り敢えず良さそうに思えちゃうものじゃないですか。

3.10.1のダウンロード&解凍作業完了! 続いてライブラリのインストール。

コマンドプロンプトを開いて・・・。解凍先フォルダへ行って・・・。ラッタッタッタ。

python -m pip install numpy で、ポチ!

ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects

・・・と、表示され、あっけなく阻止される。なんでー

エラーメッセージの内容をよく読んでみると・・・

setup.py:63: RuntimeWarning: NumPy 1.21.5 may not yet support Python 3.10.

確かに。たいへんよくわかりました。はい。

インストールするライブラリが、どのPythonのマイナーバージョンに対応しているか? なんて、対応状況をあらかじめ調査するなんてこと、まずやるわけない私のようなド素人が(無茶を承知で) Python3.10.1 にNumpyライブラリを強制インストールする凶行に及んでも、ちゃんと阻止してくれるんですね。

できればこういう大事なことは、N○Kの朝と晩の7時の全国放送で毎日しつこくアナウンスするとか、誰もがTopページにしているであろう某サイトのいちばん見やすい場所に広告として日々表示してほしい☆・・・と夜空の星に願いつつ、

「使いたいライブラリがどのバージョンに対応しているか、ダウンロード前にきちんと調べる」という貴重な教訓を得て、ここで初めて検索キーワード「numpy python 対応バージョン」でGoogle先生にお伺いをたてると、以下の情報がヒット!

Python向け科学計算パッケージNumPyの開発チームは、最新版となる「NumPy 1.20.0」を1月30日(現地時間)にリリースした。
「NumPy 1.20.0」はこれまでで最大となるアップデートで、Python 3.7~3.9をサポートし、Python 3.6のサポートは終了している。

1月30日とあるのは2021年のこと。この記事は https://codezine.jp/article/detail/13574 より引用

わかった☆OK これでバージョン3.10.1は除外。とりあえず3.9.Xのどれかにしよう。

もうひとつ、どうしても入れたいのがコンピュータの眼「OpenCV」ライブラリ。そこで、PythonとNumpyとOpenCVの関係について調べてみると・・・

opencv-python 4.5.1.48が最新です。
pythonのバージョンは3.6以上とされていますが、numpyについては特に指定はありません。
pipのバージョンは19.3以上

teratailのPythonに関する質問(https://teratail.com/questions/323063)より引用

わかった☆OK これを近所の3歳児でもわかるように言い換えてみよう。

OpenCVとNumpyは仲がイイ。

ダウンロードするPythonのバージョンは、この情報をもとに 3.9.X の中でいちばん新しい 3.9.9 に決定。

理由は次の通り。

Pythonのバージョンを意味する番号は前から順に、メジャー.マイナー.マイクロのそれぞれを意味するそうで、Pythonのメジャーバージョンは2or3。サポート状況から、これは当然「3」を選択。マイナーバージョンは、これもやはりサポート期限を考えるといちばん長いのは3.9.Xで「2025年10月」までだから、これを根拠に「3.9.X」に決定。で、さらにマイクロバージョンは「バグ修正リリース」に相当し、マイクロバージョン間については、互換性が保証されるとのこと。ならば最もバグが消えているのは「3.9.9」なのかなー。みたいな・・・

Pythonのバージョンによる違いについては、次のサイトの解説が詳しい。

Pythonの複数バージョンの扱い方(Windowsの場合)

URL:https://gammasoft.jp/python/python-version-management/

あらためて気合を入れなおし Embeddable Python3.9.9 のダウンロードを持てる全力を挙げて決行!

(正直 ポチ!するだけだけど)

控えめに言えば、Python3.9.9-32bitのEmbeddable Packageを選択してダウンロード。

3.必要なライブラリをインストールする準備

ダウンロードした Package を任意のフォルダに解凍し、ライブラリのインストールに pip が使えるよう、設定を変更( pythonNN._pthファイルを修正 )する。

デスクトップに新しいフォルダーを作成して、そこにDLしたPackageを保存(Zipファイルの大きさはたったの7.3MB!)。

これを解凍すると、

python-3.9.9-embed-win32ができる(大きさは14.0MBとかなり小さい)

python-3.9.9-embed-win32 フォルダを開き、pythonNN._pthファイルを見つけて修正を加える(NNはPythonのバージョンを示す数字)。その方法は下記の通り。

→ バージョン3.9.9をダウンロードしたから、修正するファイルは python39._pth。見つけたらテキストエディタで開いて、いちばん下の行・・・

このナンバーを削除する→ # import site

を、

import site

と コメント解除 する。(※ 正確には、削除するのは#とその後ろの半角スペース)

【補足】
3.9.10では「#import site」となっており、ナンバー#の後ろには「半角スペースがありません」でした!(20220822追記)

コメント解除したら、上書き保存(Ctrl+S)する。

※ 以前、こんな場面で「上書き保存」ではなく「名前を付けて保存」し、あろうことか、ファイル名が「例:XXXXX._pth.txt」になってしまったコトが・・・

次に、ライブラリのインストールに必要な pip を実行するためのScriptファイル get-pip.py を入手する。get-pip.py は次のリンクからダウンロードできる。ちなみにダウンロードした get-pip.py をテキストエディタで開いたら、内容が知らない言語(もしかして、コレが宇宙語?)で書かれており、驚愕。びっくり。もうあけない。

get-pip.py の入手先はこちら(https://bootstrap.pypa.io/get-pip.py

で、ダウンロードした get-pip.py を python-3.9.9-embed-win32 フォルダへコピー。これで get-pip.py が使えるので、次に説明する方法で、まずpipをインストール。

ここからはコマンドプロンプトで作業する(PowerShellでは、モジュールエラーとなり、実行出来ないようだ:情報のみ、未検証です)。

スタートボタンを右クリック→ファイル名を指定して実行→「cmd」と入力して「OK」をクリック→コマンドプロンプトが起動→「cd」+半角スペースを入力→エクスプローラーから「 python-3.9.9-embed-win32 フォルダ」をドラッグ&ドロップしてEnterキーを押す。

で、画面に表示されている > の後ろに「python get-pip.py」と入力してEnterキーを押す(下図赤のアンダーライン部分)。正しく操作が行われていれば、下の画面のようにpipのダウンロードとインストールが自動的に行われる。

pipをインストール(この時点でフォルダ全体の大きさは29.7MB)

Consider adding this directory to PATH(このディレクトリをPATHに追加することを検討してください)と警告されるが、これは気にしない。Embeddable Python を使う目的そのものが、PATHなんかどこにも通さずに

「好き勝手にPythonを使う」

ことだから。

参考:もし、ここで「’python’ は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」というエラーが出る場合は、コマンドプロンプトの現在位置(カレントディレクトリ)をよく確認すること。Python.exeがある(見える)フォルダじゃないと、>python ~ コマンドは使えない。

pipがきちんとインストールされたことを、ここで確認しておく。

python -m pip list と入力してEnter

問題がなければ、インストールされたpip他のバージョンが表示される。
「python -m pip list」で「python.exe: No module named pip」が返る場合は、 pythonNN._pthファイルの修正(# import siteの前にある記号#(ナンバー)とその後ろの半角スペースを削除して import site だけにするコメント化の解除手続き)が正しく行われていない可能性が高い。
また、複数のライブラリのインストールを行うと、 pythonNN._pthファイル が修正前の状態に戻されてしまうこともあるようだ。要確認。

4.Numpyのインストール

続いて「愛しのNumpy」をインストール。

>python -m pip install numpy と入力してEnter!

「生きていてよかった」と思える至福の一瞬がここに。

警告:Consider adding this directory to PATH (このディレクトリをPATHに追加することを検討してください) は、まったく気にしない。Numpyが入ればいいのだ。わはは*(^_^)*♪

5.OpenCVのインストール

さらに、視力0.01かつ老眼&緑内障の恐れありと診断(2万ン千円も払ったのにイタいことばかり言いやがって:チ○ショー!「我が愛と哀しみの人間ドック2021年の記録」より抜粋)された私の眼に代わるSecret Weapon、目にも止まらぬ 走召 高速!でマークシートを読んでくれる機械の眼という意味がほぼない長い前置きを乗り越え、今、怒涛のクライマックス。「OpenCV」ライブラリがいよいよ My PC へ!

サぁイレント ナァイ~ ホぉリィ ナァイ~(さらに意味なし)

>python -m pip install opencv-python と入力してEnter!

注意:「opencv」に続けて「-python」が必要。

念願のOpenCVのインストールについに成功した・・・その日、彼は狂喜乱舞して泣き崩れたという。彼の日記の末尾には「OpenCVよ。永遠なれー」の文字が。

ちなみに、この時点で「Numpy」と「OpenCV」を入れた「python-3.9.9-embed-win32」フォルダの内容は152MB!と他を圧する勢いで巨大化していた。最初は15MB程度しかなかったのに10倍に膨れ上がっている・・・。

なんということか。すでに語るべき言葉を私は持たない。大きな広い美しい心で、この変化をありのままに・・・、そうだ、謙虚に受け止めよう。さぁ深呼吸だ。おぉ空気がうまい。生きてるってことは素晴らしい。

そう言えば、私が書いたDelphiのプログラムをことごとく「ウイルス扱い」して「隔離」しやがる某有名ウイルス対策ソフトも、今日は静かにしてるじゃないか。人間、すべからく、受容することが肝心だ。別にPCの重さがいつの間にか10倍になって、持ち運び困難になったわけではないのだから。

6.単体で動作確認(検証)

作成したEmbeddable Pythonのフォルダ「python-3.9.9-embed-win32」は名前が長く、ちょっと扱いにくいので、フォルダ名をもう少し短く、わかりやすい名前に変更してから、動作検証を行う。

変更前: python-3.9.9-embed-win32 → 変更後:python39-32

フォルダ名の意味:前から順に「Pythonが入っているフォルダで、そのメジャーバージョンは「3」、マイナーバージョンは「9」で、ターゲットプラットフォームは32ビット版だよ」と、全世界のユーザーにやさしくPR(どこかのサイトでこの表記法を見て感動!)。

【動作検証の準備】

上で作成した「python39-32」フォルダと同じ階層に、新しく「psf」という名前のフォルダを作成する。ここにテスト用のScriptファイルや画像データを保存する。

【説明】psf:「P」ythonの「S」criptが入っている「F」older ・・・ という意味。

データ保存用の psf フォルダを作成

【動作検証用の環境変数設定バッチファイルを作成】

最終的にはDelphiから操作する予定のEmbeddable Pythonだが、ここでは動作検証用のバッチファイルを作成し、これを起動してテスト用のScriptを走らせる。

最初に環境変数をセットするバッチファイルを作成する(バッチファイルの作成に関しては、下記参考リンク先:「Windowsでpythonを使う/配布する時に便利!Python embeddable package使い方」に大変詳しい解説があります。作成した方に心から感謝 m(__)m )。

以下の3行をテキストエディタに入力(コピペ)し、文字コードはUTF-8を指定して「setmyenv.bat」という名前を付けて、上の図の「新しいフォルダー」に保存する。

SET DP0=%~dp0
SET PATH=%DP0%\python39-32;%PATH%
SET PYTHON_PATH=%PYTHON_PATH%;%PYTHON_PATH%\Scripts

1行目で、バッチファイルのあるフォルダをカレントディレクトリに指定
2行目で、PATHにEmbeddable Pythonを入れたフォルダへのパスを設定
3行目で、Python.exeとpip.exeへのパスを設定

【動作検証用のスクリプト実行バッチファイルを作成】

続いてScriptを実行するためのバッチファイルを作成する。 以下の5行をテキストエディタに入力(コピペ)し、文字コードはUTF-8を指定して「python_script.bat」という名前を付けて「新しいフォルダー」に保存する。

@echo off
cd /D %~dp0
call setmyenv.bat
cd psf
cmd

1行目は、コマンドプロンプトの画面表示を抑制して見やすくする
2行目は、 バッチファイルのあるフォルダをカレントディレクトリに指定
3行目は、環境変数設定用バッチファイルを内部的に呼び出して実行
4行目で、画面に表示するディレクトリへ移動
5行目は、コマンドプロンプトを表示する

フォルダとファイル構成

【検証用スクリプトを作成】

Embeddable PythonにインストールしたNumpyとOpenCVをインポートして動作する検証用のScriptを作成する。 以下の内容をテキストエディタに入力(コピペ)し、文字コードはUTF-8を指定して「test.py」という名前を付けて「psf」フォルダーに保存する。

import numpy as np
import cv2

img = cv2.imread("test.jpg")
print(type(img))   # Numpy配列に画像データが読み込まれたことを確認
print(img.shape)   # OpenCVが読んだ画像情報(縦横画素数他)を表示

【検証用画像を用意】

任意のJpeg形式の画像を「test.jpg」という名前で「psf」フォルダーに用意する。画像ファイル名に日本語は使えないことに注意する(OpenCVの読み書きコマンドは日本語に対応していないため、日本語が混じっているとエラーになる)。この問題への対応方法は下記参考リンクをご参照ください。

psf フォルダの内容

【検証】

(1)「python_script.bat」 をダブルクリックしてコマンドプロンプトを起動。

コマンドプロンプトを起動したところ

(2)赤で示した下線部に「python test.py」と入力してEnterキーを押す。

黄色の枠内に結果より正しく動作したことがわかる。
<class ‘numpy.ndarray’>:データ形式はNumpyの配列、
(284, 283, 3)は、縦・横の画素数とチャンネル数を示す。

【参考URL】

Windowsでpythonを使う/配布する時に便利!Python embeddable package使い方

URL:https://hituji-ws.com/code/python/python-emb-usage/

Python OpenCV の cv2.imread 及び cv2.imwrite で日本語を含むファイルパスを取り扱う際の問題への対処について

URL:https://qiita.com/SKYS/items/cbde3775e2143cad7455

WindowsでPython3.7の実行環境を手早く作る方法

URL:https://qiita.com/hirohiro77/items/377dfc0a264acb3db222

7.まとめ

(1)使用目的や使用条件、必要なライブラリのインストール上の制約(どのバージョンのPythonに対応しているか)、何bitのアプリケーションに埋め込むのか等、事前に必要事項を十分調査した上でダウンロードするEmbeddable Pythonのバージョンを決める。

(2)ライブラリのインストールは必ず「Python -m」を付ける。→ 付けないとモジュール参照パスの指定等に問題が発生(構成を壊してしまうとの情報あり:参考リンク「WindowsでPython3.7の実行環境を手早く作る方法」を参照)するようだ。

Python -m pip install (ライブラリ名)

(3)必要なライブラリをインストール後、実際にそれらをimportして動くPython Script をEmbeddable Pythonで動かし、確実に動作することを確認する。Delphiに埋め込んでから余計なトラブルに悩まされないよう、ここで必ず単体で動作することを確かめておく。

8.お願いとお断り

このサイトの内容を利用される場合は、自己責任でお願いします。記載した内容を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。

【関連記事】