🐍

uvでWindows向けGUIアプリケーション作成用のPythonプロジェクトを作成する方法

に公開1

こんにちは、かたさんです。
Markdownで記述できて使いやすそうなので、初めてZennを使っています。

最近Python界隈ではアツいとされているuvを僕も導入してみました。会社では元々pipの代わりとしては使っていましたが、pyenvやcondaのようにPythonのバージョン切り替えも行える点が良さそうだったので、これを機にしっかり覚えてみました。

単にuvでPythonのプロジェクトを作成するだけでなく、普段の趣味プログラミングでの開発スタイルに準じて以下の手順を含む記事となります。

  • Windowsアプリ向けPythonプロジェクトを作成する
  • プロジェクトに必要なpipモジュールを追加する
  • 配布用exeのビルドを行う(nuitka)
  • 他の環境で再現できるようにプロジェクト関連ファイルをコミットする

今回の成果物は以下にコミットしています。
https://github.com/dj-kata/uv_wpy_sample.git

筆者がこれまで作ってきたもの

プログラミングについては完全に趣味ですが、以下のようなアプリを作ってきました。

GUIの部分にはそこまで多くを求めていないので、楽に開発するために全てPythonで書いてきました。
昔はAndroidやらJavaFXやらを触ったりもしましたが、今はこのスタイルに落ち着きました。

上記のものも含めてOpen Broadcaster Software(OBS)関連の補助ツールも色々作っています。WebsocketAPIを叩いてOBSを自動制御したり、HTML5の機能(Ajax、WebSocket)を使ってOBSに様々な情報をリアルタイム表示する機能を作ったりしました。

前提

上記のようなアプリを作る上で、以下を前提条件とします。

  • つくりたいもの: Windows向けGUIアプリ
    • GUIはTkinterで作成
    • Pythonのない環境で実行できるようにexeファイル化
  • 環境: WSL+VSCodeで開発・検証・ビルド
    • WSL側のPythonではなく、Windows版Pythonで実行する必要がある

WSL側からWindows側のuvを使う点に注意しておきます。
uvをWSL側にもインストールする場合に競合しないように、ここでは以下のように別名にaliasを張るものとします。

.zshrc
alias wuv='/mnt/c/Users/katao/.local/bin/uv.exe'

明らかに正しいWindows用アプリ開発のスタイルではないと思いますが、zshやtmuxが使えないとしんどいのでこのスタイルでやっています。

uvの使い方

uvのインストール

powershell上で以下を実行することでインストールできます。

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

WSL側でWindows側のuvを叩きやすいようにaliasを設定します。

.zshrc
alias wuv='/mnt/c/Users/katao/.local/bin/uv.exe'

利用したいバージョンのPythonをインストールしておきます。

wuv python install 3.12 3.13

プロジェクト作成

以下のように作成します。-pでプロジェクトで使うPythonのバージョンを指定できます。

wuv init uv_test -p 3.12
cd uv_test # プロジェクトディレクトリに移動しておく

以下の操作は全てuv_testディレクトリ内から行います。

コード作成

コードを作成します。なんでもいいので簡単なHello world!とします。

main.py
import tkinter as tk

root = tk.Tk()
root.title("Hello World App")
tk.Label(root, text="Hello world!", font=("Arial", 16)).pack(expand=True)
root.mainloop()

作成したアプリの実行

wuv run main.py

以下のようなGUIが表示されるはず。

作成したアプリのビルド

ここでは、nuitkaを利用してWindows向けバイナリを作成します。

# nuitkaをプロジェクト内にインストール
wuv add nuitka

# ビルド
wuv run python -m nuitka -j 8 --remove-output --windows-console-mode=disable --standalone --enable-plugin=tk-inter main.py

ビルド時のパラメータでは、Python未インストールの環境でも動くようにしたり、tkinterを使うアプリをビルドできるようにしたりしています。

作成したプロジェクトをgitへコミット

Githubなどへ登録する場合は、以下のように作成されたファイルを一通りコミットします。

git add main.py pyproject.toml uv.lock .python-version
git commit

このように作成されたレポジトリを別の環境で取り込む際は、以下のようにすればよいです。

git clone https://github.com/dj-kata/uv_wpy_sample.git
cd uv_wpy_sample
wuv sync
wuv run main.py

pipの作法ではpip install -r requirements.txtをして必要なパッケージをインストールするかと思いますが、uvの場合はlockfileに必要な情報が書いてあるようです。

おわりに

というわけで、uvを使ってWindows用GUIアプリ向けPythonプロジェクトを管理するための手順をまとめてみました。

uvではビルドにかかる時間がpipの10倍以上高速化されているらしいですが、プロジェクト管理周りの機能も素晴らしく、しっかり使っていきたいなと思いました。

ここまで偏った開発環境の人がどれほどいるのかは分からないですが、皆様も是非uvを使ってみてください。

では。

Discussion

かたおかたお

ビルド前にコードの難読化までするならnuitkaよりもpyinstallerでやる方がいいかもしれない。
その場合にやることは以下。pyarmorがpython3.12ではうまく動かないため、3.11でやる必要がある点に注意。

# パッケージのadd
wuv add pyarmor
wuv add pyinstaller

# pyinstallerオプションの追加
wuv run pyarmor cfg pack:pyi_options = " --noconsole --clean"

# ビルド
wuv run pyarmor -d gen --pack onefile main.py