LoginSignup
2
1

Windows11でPython環境の自動構築

Posted at

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つに分けています。

install_python.ps1
# 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のインストーラは以下のページからダウンロードしています。

setup_venv.ps1
$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に記述されたものをインストールするようにしています。

バッチファイル

install_python.bat
@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を認識してくれませんでした。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1