Pythonで作成したアプリを社内で配布したいとき、exe化するのが最も手っ取り早いと思いますが、やんごとなき事情によりPythonのファイルをそのまま配布したい時があります。
その場合、使うPCでPythonの環境構築をしてもらう必要がありますが、コマンドを1行見せただけで蕁麻疹が出てしまう人には非常にハードルが高いです。
そこで、Pythonの環境を自動構築するバッチファイルを作成してみたので、ここにメモしておきたいと思います。もう少しスマートな方法をご存じの方いましたら、アドバイスいただけると幸いです。
なお、デバッグはWindowsサンドボックス
で行いました。Windowsの環境を汚さずに試行できるのでお勧めです。使い方はこのサイトを参考にしています。
前提条件
- Windows11
-
winget
などの便利なツールがインストールされていない - Pythonもインストールされていない
- バッチファイル1つの読み込みで設定完了させる
構成
今回は一つのフォルダの中に以下のファイルを格納しています。
install_python.bat
install_python.ps1
setup_venv.ps1
python-3.11.0-amd64.exe
requirements.txt
PowerShellスクリプト
全てバッチファイルに書いてもよいのですが、個人的にはPowerShellスクリプトの方が慣れているのでこちらをメインに使用しています。
PowerShellスクリプトは2つに分けています。
# Pythonインタプリンタのパスを取得する
$is_python = Get-Command python -ErrorAction SilentlyContinue
if ($is_python -eq $null) {
echo "Python is not installed. Installing Python..."
# すべてのユーザーにインストールしない、パスを追加する、テストを含めない
./python-3.11.0-amd64.exe /quiet InstallAllUsers=0 PrependPath=1 Include_test=0
echo "Python has been installed."
}else{
echo "Python is already installed."
}
echo "We will start to setup a virtualenv in 10 seconds..."
install_python.ps1
は主にPythonのインストーラを起動させてインストールするためのファイルです。
./python-3.11.0-amd64.exe /quiet InstallAllUsers=0 PrependPath=1 Include_test=0
ここがメインの部分です。Python 3.11.0
のインストーラを起動して特定のユーザーのみにインストールしてPathを通す設定になっています。以下の記事を参考にさせてもらいました。
Python 3.11.0
のインストーラは以下のページからダウンロードしています。
$VENV_PATH = $HOME + '\venv\dev311'
# すでに\venv\dev311という仮想環境が存在しているかチェック
if (Test-Path $VENV_PATH) {
Write-Host "Virtual environment already exists at $VENV_PATH"
exit
}
& $HOME\AppData\Local\Programs\Python\Python311\python.exe -m venv $VENV_PATH
& $VENV_PATH\Scripts\python.exe -m pip install --upgrade pip
& $VENV_PATH\Scripts\pip.exe install -r requirements.txt
setup_venv.ps1
は仮想環境を構築するためのファイルです。仮想環境構築のコマンドはいつも通りのpython -m venv <仮想環境名>
を、ライブラリのインストールはpip install -r requirements.txt
を使用してrequirements.txt
に記述されたものをインストールするようにしています。
バッチファイル
@echo off
powershell -ExecutionPolicy Bypass ./install_python.ps1
timeout 10 /NOBREAK
powershell -ExecutionPolicy Bypass ./setup_venv.ps1
2つのスクリプトファイルを逐次実行させるためのファイルです。このファイルを起動してもらう想定です。2つ目の仮想環境を構築するスクリプトを実行させる前に、10秒間待つようにしています。
つまずいた点
1. バッチファイルを抜けないとPython
コマンドを認識してくれない
これが$HOME\AppData\Local\Programs\Python\Python311\python.exe
としてPythonを動かしている理由です。Env:Path
などで一時的にPath
を通そうとしてもダメでした。このあたりの解決策わかる方いたらだれか教えてください。
2. PowerShellスクリプトファイルを1つにすると<フルパス>\python.exe
が実行できない
インストーラ―の実行が完了した時点でpython.exe
の配置が完了しているようですが、一旦、PowerShell
のプロセスを終了させないとフルパスで指定したとしてもpython.exe
の存在を認識できないようでした。
3. デフォルトでインストールされているライブラリを認識させるためには一定時間待つ必要がある?
バッチファイル内で10秒間処理を止めているのはこれのためです。なぜかわかりませんが5秒以内に環境構築を開始した場合はプロセスエラーになったり、Pythonが起動しなかったり、様々なエラーが発生しました。これは使用するPCの性能によって変わるかもしれません。
ちなみに、ベース環境でpip install
を実行しようとすると、バッチファイルを抜けるまでは何秒待ってもpip
を認識してくれませんでした。