はじめに
Embedded Python を利用すると、Python がインストールされていない PC でも Python スクリプトを実行できる環境を構築できます。本記事では、Embedded Python の特徴、導入方法、および運用時の注意点を解説します。
導入の目的
まだ構想段階ですが、社内の共有フォルダにembedded python で作成したツールを置いておけばPythonをインストールしていない人のPCからでも使えるようになるのでは?と思い調査を始めました。
参考サイト
Embedde Pythonを調べる際に下記のサイトを参考にさせて頂きました。他にも情報をあげて下さっているサイトはありましたが、こちらの記事が一番私の目的に合っていたので紹介させていただきます。基本的にはこちらのサイトの内容にそって行えば導入可能ですが、改めて手順と補足事項をまとめたいと思います。
Embedded Python の特徴
- レジストリや環境変数の影響を受けない
- ユーザー環境とはほぼ隔離された状態で動作する
- Python の標準ライブラリは
pythonXX.zipにバイナリデータとして提供 pipなどの一部の機能はデフォルトでは含まれていない
詳細は公式ドキュメントを参照してください: Embedded Python に関する公式ドキュメント
Embedded Python の導入方法
- 公式サイトから Embedded Python をダウンロードし、任意のフォルダに解凍する。
- Python Packaging User GuideのInstalling Packagesの項にあるget-pip.py をダウンロードし、Python 本体と同じディレクトリに配置する。
get-pip.pyを実行し、pip をインストールする。pipでパッケージをインストールするために、._pthを編集し# import siteのコメントを解除する。- 必要なパッケージを
pip installでインストールする。 - 自作の Python スクリプトをインポートする場合は、
._pthを編集してコードのあるディレクトリを追記する。
導入における補足
._pthファイルにディレクトリを追加する場合
インストールされた実行ファイルpython.exeと同じフォルダにある._pthに記載する。
例えば下記のようなファイル構造の場合でMyLibにあるutil.pyをmain.pyから利用したい時
- Embedded_Python (ルートフォルダ) - PythonXX (Embedded Python本体) - pythonXX._pth ← ここにMyLibへのパスを追加 - Project (実行するスクリプトがあるフォルダ) - main.py (ここからMyLibにあるモジュールを利用する) - MyLib (自作モジュールフォルダ) - util.py
.pthの編集
pythonXX.zip . # 自作モジュールを使用するためにディレクトリを追加する # フォルダのMyLibが格納されている親フォルダまでの相対パスを追記する ../Project import site
main.pyからMyLibにあるutil.pyを利用する
from MyLib import util # util.pyで定義れれタイル関数 util_func を実行 util.util_func()
運用時の注意点
- 環境変数の影響を受けないとされているが、Python 実行前の環境変数は影響する可能性があるため、コマンドプロンプトや PowerShell で実行時に Python のパスを明示する。
pip install --userを使用すると、システムのユーザーディレクトリにパッケージがインストールされるため、ポータブル環境では--userオプションを付けずにインストールする。
技術的な考察
get-pip について
get-pip.py は、通常の Python インストールに含まれる pip がない環境で pip を導入するために用意されたスクリプトです。公式ドキュメントのget-pipへのリンクを右クリックしてダウンロードできます。
import siteについて
デフォルトでは._pthにかかれたimport siteはコメントアウトされています。
pipとpipでインストールしたモジュールを使用するためにはimport siteを有効にする必要があります。
Python の import site は、pip install によってインストールされたサードパーティ製モジュールを使えるようにするために必要です。 このモジュールが有効になると、インストールされたモジュールが存在するディレクトリが sys.path に自動で追加されます。
sys.path は、Python がモジュールを探すときに参照するパスの一覧です。つまり、どこのモジュールを使用しているかを確認したい場合、sys.path を調べることでそれが分かります。
以下は、sys.path の中身を確認する簡単なスクリプトです:
import sys
for path in sys.path:
print(path)
import site によって追加されるパスは、主に sys.prefix および sys.exec_prefix を起点に構成されます。これらのプレフィックスに対応する site-packages ディレクトリが存在すれば、それが sys.path に追加される仕組みです。
詳しくは公式ドキュメントをご覧ください: https://docs.python.org/3.13/library/site.html
._pth の役割
._pth ファイルがある場合、Python は環境変数を無視し、指定されたパスのみを sys.path に追加します。これにより、完全に隔離された環境を構築できます。
環境変数 PYTHONPATH は本当に無視されるのか?
埋め込み Python に ._pth ファイルが存在する場合、ドキュメントには環境変数 PYTHONPATH が無視されると記述されています。実際に次の手順で検証してみました:
- コマンドプロンプトで
set PYTHONPATH=C:\TestModulesを実行 - そのまま埋め込み Python で起動されたスクリプトを実行
os.environ['PYTHONPATH']では値が確認できる- しかし
sys.pathにはC:\TestModulesは含まれていない
このことから、. _pth ファイルが存在する環境では、PYTHONPATH 環境変数は無視され、sys.path の決定にも影響を与えないことがわかります。
まとめ
Embedded Python を利用することで、Python のインストールが不要なポータブル環境を構築できます。システムの設定を変更せずに Python ツールを配布・運用できるため、特に社内ツールやスタンドアロンアプリケーションの開発に適しています。