LoginSignup
22
25

More than 3 years have passed since last update.

PythonのWindows用EXE化をDockerコンテナで実現する方法

Posted at

Docker上のLinuxで使ってるPythonコードを、人に渡すためにぱぱっとEXE化したい人むけ。

利用するコンテナ

windowsでPyInstallerを実行するコンテナを配布されている方がいらっしゃるので、利用させていただきます。

Dockerfileを読んだところ、以下ののWindowsアプリケーションをLinux上で実行するソフトウェアを利用しているようです。

サイトのTOPに乗っているWineHQの説明(和訳は適当なのであしからず)

Wine (元々 "Wine Is Not an Emulator "の頭文字をとったもの) は、Linux、macOS、BSDなどのPOSIX準拠のオペレーティングシステム上でWindowsアプリケーションを実行できる互換性レイヤーです。仮想マシンやエミュレータのように内部のWindowsロジックをシミュレートするのではなく、WineはWindows APIコールをPOSIXコールにその場で変換し、他の方法によるパフォーマンスやメモリのペナルティを排除し、Windowsアプリケーションをデスクトップにクリーンに統合することができます。

実行コマンド例

何度も実行することが多いのでシェルスクリプトにして実行しています。
以下のシェルスクリプトをソースコードのあるディレクトリで実行すれば、同じ階層にbuildやdistディレクトリ、.specファイルが生成されます。作成されたWindows用EXEはdistディレクトリの中にあります。

build.sh
#! /bin/bash
docker run --rm -v "$(pwd):/src/" --entrypoint /bin/sh cdrx/pyinstaller-windows \
-c "/usr/bin/pip install -r requirements.txt && pyinstaller main.py --noconsole --onefile --clean"
  • docker run:コンテナの実行コマンド
  • -rm:コンテナ終了後にコンテナを消去
  • -v "$(pwd):/src/":ホストOSのカレントディレクトリをコンテナOSの/src/にマウント
  • --entrypoint /bin/sh実行時にコマンドを渡す相手の指定(今回はshを指定)
  • cdrx/pyinstaller-windows:実行するイメージの指定。cdrx/pyinstaller-linuxを使うとLinux用実行ファイルも作れます。まあ、普通の開発用コンテナでやってもいいと思います。
  • -c "~ hogehoge ~":コンテナ内で実行するコマンドを指定
  • /usr/bin/pip install -r requirements.txt:pipで依存関係をインストール。apt等のインストールが必要な場合は追記
  • pyinstaller main.py --noconsole --onefile --clean:本題のexe化コマンド。コンソールなし、1ファイル化、前回の結果を消去のオプションを指定。

実行結果

今の所3種類ほどのコードをexe化して、win10とwin8で実行しましたが問題なく起動できた。
また、PySimpleGUIのコードも問題なくexe化できたのでPythonでWindows用GUIをサクッと作りたい人にはおすすめしたい。

22
25
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
22
25