🍷

UNIX 環境で PyInstaller を使って Windows の exe 作成

2022/11/18に公開約2,200字

結論

UNIX 環境で PyInstaller を利用して Windows の exe を作成したい。
WINE が動く Docker 環境を用意する。

$ git clone https://github.com/oooooooo/docker-pyinstaller.git
$ docker image build -t oooooooo/pyinstaller:latest .
$ docker run --rm -v "$(pwd):/src/" oooooooo/pyinstaller:latest -c \
"pip install -r requirements.txt && \
pyinstaller main.py --onedir --onefile --clean"
$ file main.exe
main.exe: PE32+ executable (console) x86-64, for MS Windows

経緯

Python スクリプトを Python がインストールされていない Windows 環境に配布したい。PyInstaller を利用すれば単一ファイルの実行形式が作成できる。

PyInstaller は残念ながらクロスコンパイルできない

PyInstaller is tested against Windows, MacOS X, and Linux. However, it is not a cross-compiler;

なので WINE を使えばいい。そんな Dockerfile を作った方がいる。

https://github.com/cdrx/docker-pyinstaller

WINE の環境構築などなど本当にありがたい。ただし 2020 年で更新が止まっている。そのためバージョンが古くていくつかの PyInstaller オプションが使えない。

新しいバージョンの PyInstaller のプルリクもあるけど反応なし。

新しくするには Dockerfile-py3-win64 のバージョンを変えればいい。

FROM ubuntu:16.04

ENV DEBIAN_FRONTEND noninteractive

ARG WINE_VERSION=winehq-staging
ARG PYTHON_VERSION=3.7.5
ARG PYINSTALLER_VERSION=3.6

なので Dockerfile-py3-win64 を Dockerfile に cp してバージョンを書き換え、新しい Ubuntu 環境でも動くように編集。

$ diff Dockerfile-py3-win64 Dockerfile
1c1
< FROM ubuntu:16.04
---
> FROM ubuntu:22.04
6,7c6,7
< ARG PYTHON_VERSION=3.7.5
< ARG PYINSTALLER_VERSION=3.6
---
> ARG PYTHON_VERSION=3.11.0
> ARG PYINSTALLER_VERSION=5.6.2
13c13
<     && apt-get install --no-install-recommends -qfy apt-transport-https software-properties-common wget \
---
>     && apt-get install --no-install-recommends -qfy apt-transport-https software-properties-common wget gpg-agent rename \

Ubuntu 22.04 環境は rename がないのと、apt-key ではなく gpg-agent なので追加。

これで新しい PyInstaller が使えるようになりました。

結語

バージョンはハードコーディングせず環境変数を使えば汎用的だけど自分には十分なので、とりあえずこのまま。元の cdrx/docker-pyinstaller 作者さんもそうなんじゃないかな。

2 年後、さらに新しいバージョンが必要になったらエディタでバージョン書き換える用にこの記事を書きました。

もし頻繁に更新する事態になったら環境変数にするし、プルリクもらえれば取り込みます。今はここまでたどり着くのに疲れたので終わります🍷

https://github.com/oooooooo/docker-pyinstaller

Discussion

ログインするとコメントできます