Pythonアプリをexe化してみました。
使ったのは Nuitka というツールです。
- Pythonコードのexe実行ファイルへの変換、
- コンパイルに失敗する場合の回避策、
- 実際にexe化したのを動かした感想…
そういうのを実体験としてまとめます。
NuitkaによるPython exe化はつぎの手順です。
このページの目次
1.対象となったPythonアプリのモジュール構成
まず対象となったPythonアプリについてです。
Python本体バージョンは3.6.0
ほぼ最新のものを使っていました。
また外部ライブラリも色々インストールしてます。
以下のようなモジュール構成となっています。
- certifi 2021.5.30
- numpy 1.19.5
- opencv-python 4.6.0.66
- PyQt5 5.15.6
- PyQt5-Qt5 5.15.2
- PyQt5-sip 12.9.1
- wheel 0.37.1
PySide2とOpenCVを使用しています。
2.pip経由でNuitkaをインストール
uitkaのインストールはとても手簡単です。
単純にpipからパッケージインストするだけ
▼ このようなpipコマンド
1 |
> pip install nuitka |
▼ 無事Nuitlaのインストール完了
1 2 3 4 5 6 7 8 9 |
Collecting nuitka Downloading Nuitka-0.9.4.tar.gz (3.9 MB) |■■■■■■■■■■| 3.9 MB 2.2 MB/s Building wheels for collected packages: nuitka Building wheel for nuitka (setup.py) ... done ... Successfully built nuitka Installing collected packages: nuitka Successfully installed nuitka-0.9.4 |
最新バージョンは 0.9.4 です。
3.Nuitka実行でpythonコードexe化を試したが…
早速Nuitkaを使ってpyをexe化してみます。
▼ Nuiktaによる実行ファイル化のコマンド例
1 |
> python -m nuitka --standalone app.py |
▼ バイナリへのコンパイルが開始する
1 2 3 4 5 6 7 8 9 10 11 |
Nuitka-Options:INFO: Used command line options: --standalone app.py Nuitka:WARNING: Using very slow fallback for ordered sets, please install 'orderedset' PyPI package for best Python Nuitka:WARNING: compile time performance. Nuitka:INFO: Starting Python compilation with Nuitka '0.9.4' on Python '3.6' commercial grade 'not installed'. Nuitka-Plugins:WARNING: Use '--enable-plugin=pyside6' for: Standalone mode support and Qt plugins. Nuitka-Plugins:INFO: implicit-imports: Implicit dependencies of module 'PySide6.QtMultimediaWidgets' added 'PySide6.QtCore,PySide6.QtGui,PySide6.QtWidgets,PySide6.QtMultimedia'. Nuitka-Plugins:INFO: implicit-imports: Implicit dependencies of module 'PySide6.QtGui' added 'PySide6.QtCore,os,shiboken6,shiboken6.Shiboken'. ...... Nuitka-Scons:INFO: Compiled 102 C files using clcache with 101 cache hits and 1 cache misses. Nuitka:INFO: Keeping build directory 'app.build'. Nuitka:INFO: Successfully created 'app.dist\\app.exe'. |
大体数分くらいかかりました(詳細は後述)
そして実行ディレクトリに以下2つが生成されます。
- app.build (dir)
- app.dist (dir)
実行ファイルはapp.distの方にあります。
▼ 実行できるかな?ドキドキ
▼ 残念!次のエラーが出てしまった…(-_-;)
1 2 |
qt.qpa.plugin: Could not find the Qt platform plugin "windows" in "C:\@APP-D~1\@MINEC~3\SOFTWA~1\PYSIDE~1\APP-FO~1.DIS\PySide6\plugins\platforms" This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. |
どうやらPySide6の初期化に失敗した模様です。
何が問題なのか考え直すことに。
4.Nuitka --plugin-enable オプションでexe化成功!
先ほどのコンパイルメッセージを読んでみました。
すると所々で警告が出ています。
▼ 以下の Nuitka-Plugins:WARNING: の箇所)
1 2 3 4 5 6 7 8 9 10 |
Nuitka:WARNING: Using very slow fallback for ordered sets, please install 'orderedset' PyPI package for best Python Nuitka:WARNING: compile time performance. Nuitka:INFO: Starting Python compilation with Nuitka '0.9.4' on Python '3.6' commercial grade 'not installed'. Nuitka-Plugins:WARNING: Use '--enable-plugin=pyside6' for: Standalone mode support and Qt plugins. Nuitka-Plugins:INFO: implicit-imports: Implicit dependencies of module 'PySide6.QtMultimediaWidgets' added 'PySide6.QtCore,PySide6.QtGui,PySide6.QtWidgets,PySide6.QtMultimedia'. ... Nuitka-Plugins:INFO: implicit-imports: Note, when using 'PySide6', consider using '--disable-console' option. Otherwise a terminal window will open. Nuitka-Plugins:WARNING: Use '--enable-plugin=numpy' for: Numpy support for at least 'numpy'. Nuitka-Plugins:INFO: implicit-imports: Implicit dependencies of module 'cv2' added 'cv2.cv2,numpy,numpy.core'. Nuitka-Plugins:INFO: implicit-imports: Implicit dependencies of module 'numpy.core' added 'numpy.core._dtype_ctypes,numpy.core._multiarray_tests'. |
ヒントというか答えが書いてありますね。
単純に以下オプションを追加すればいいだけ
▼ この場合は次の2つが必要
- --enable-plugin=pyside6
- --enable-plugin=numpy
もし Nuitka-Plugins:WARNING: Use '--enable-plugin=***' のような警告を見つけたら、その通りにオプションを追加してあげてください。
▼ これらを指定してNuitka実行してみた
1 |
> python -m nuitka --standalone --plugin-enable=pyside6 --enable-plugin=numpy app.py |
▼ そして出来上がったexeを実行してみると…
▼ 無事exeとしてアプリ起動できた!
exe単体で動いているのを見ると感動する
モジュール的にも問題なく動作してくれました。
単一exeファイルを生成するなら --onefile を付ける
先ほどだと ***.dist にexeが生成されました。
ここには依存DLL・リソースが含まれています。
もしそれらを1つのexe・バイナリにまとめたいなら…
▼ Nuitka --onefile オプションを付けて実行
1 |
> python -m nuitka --onefile --plugin-enable=pyside6 --enable-plugin=numpy app.py |
モジュールDLL・依存ファイル・リソース・その他が1つのexeファイル(他OSならバイナリ)に全てバインドさせることが可能です。
ただし --standalone を試してから実行してください。
コンパイル実行の時間・動作速度などについて
次の環境でNuitkaコンパイルを行いました。
▼ 当環境のスペック
- OS : Windows10
- CPU : Core i7
- メモリ : 64GB
コンパイル所要時間は2分20秒ほど
恐らくこの所要時間はOSスペックによります。
メモリ64GBだとそこまで遅さは感じませんでした。
ただ普通はメモリ8GB・16GBとかだと思います。
最低でも数十分はかかると見込んでおくべきです。
また実行したexeの体感動作について
- 実行までにかかる時間は標準的
- 少なくともpython実行よりも早い
- 動作もpythonと同等かそれより快適
ネイティブアプリだけあって動作は快適です。
1つのexeにまとめると、少し立ち上がりが遅いかも
以上、NuitkaでPython exe化でした。ではまた