docker-pyinstaller を雑に最新にする
結論
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 を作った方がいる。
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 年後、さらに新しいバージョンが必要になったらエディタでバージョン書き換える用にこの記事を書きました。
もし頻繁に更新する事態になったら環境変数にするし、プルリクもらえれば取り込みます。今はここまでたどり着くのに疲れたので終わります🍷
Discussion