Pythonアプリのexe化で挫折していませんか?
みんな、こんにちは!元アイドル志望のシステムエンジニア兼AIライター、星野りりあだよっ。今日はね、WindowsでPythonアプリをexe化して配布したいって夢を持つみんなに、超リアルなトラブルとその解決策をシェアするね。
あたしもね、社内ネットワークでSSLインスペクションがある環境で、Pythonアプリをexe化しようとして、「PyInstallerがビルドエラーで落ちる」「exe実行時にSSL証明書エラー」というダブルパンチに遭ったの。でもね、AIと試行錯誤の末に解決策を見つけたんだよ!しかも、その過程で見つけた「Ultimate Python App Builder」がめちゃくちゃ助けになってくれたの。夢は叶わなかったけど、AIがいるからまだ諦めない!推しはAI、担当はあたし!
- PyInstallerでexe化する際の「pip-system-certs」が引き起こす複合トラブルの正体
- ビルドエラーとSSLエラーの別々の原因を分離して解決する方法
- Pythonアプリ配布の悩みを一気に解決する「Ultimate Python App Builder」の活用法
なぜ.pyでは動くのに.exeでは壊れるの?
まずね、みんながハマるポイントを整理するね。社内ネットワークでHTTPS通信するために、Windowsの証明書ストア(社内CA含む)を使いたいって要件があったとするでしょ?そこでpip install pip-system-certsを導入すると、以下の連鎖が起きるの。
原因①:ビルド環境の破壊(setuptoolsとdistutilsの競合)
pip-system-certsは起動時に自動介入する仕組みを持っているの。その結果、pipやdistutilsがsetuptoolsより先にimportされるんだね。すると、setuptoolsが本来行うdistutils差し替え(_distutils_hack)が失敗して、import setuptoolsがAssertionErrorで壊れちゃうの。PyInstallerのhook-setuptools.pyがsetuptools情報を取れずに落ちるってわけ。
じゃあ、なんで.pyで実行すると問題ないの?
.py実行時はsitecustomizeや.pthなどの自動処理が効くから、pip-system-certsがうまく介入できるんだよ。でもexe化すると、そうした自動処理が効かなくなるから、SSLエラーが発生するんだ。
原因②:exe実行時のSSL初期化不足
exe化すると、requestsやurllib3がcertifi(Mozilla CA)だけを見るようになるの。社内CAを信頼できないから、[SSL: CERTIFICATE_VERIFY_FAILED]が発生しちゃうんだね。.pyでは動くのに、exeだけ失敗するのはこれが理由なの。
実際に有効だった解決策ステップ
あたしが試してうまくいった方法を、手順形式で紹介するね。ビルド時と実行時の責務を分離するのがポイントだよ。
コマンドプロンプトで
set SETUPTOOLS_USE_DISTUTILS=stdlibを実行してから、pyinstaller your_main.pyを実行するよ。これでビルド自体は通るようになるの。警告は出るけど問題なし!メインスクリプトの最上部(requestsより前)に、以下のコードを追加するんだよ。
import truststore
truststore.inject_into_ssl()
import requests
これでexe実行時もWindowsの証明書ストア(社内CA含む)が使われるようになるの。
hook_truststore.pyというファイルを作って、中身を以下のようにするよ。
import truststore
truststore.inject_into_ssl()
そして、pyinstaller --onefile --runtime-hook hook_truststore.py your_main.pyでビルドすれば、exe実行時も確実にtruststoreが適用されるんだね。
採用したバージョン構成と比較表
あたしが実際に使って安定したバージョン構成を紹介するね。みんなも参考にしてね。
| パッケージ | バージョン | 役割 |
|---|---|---|
| Python | 3.11 | ベース環境 |
| PyInstaller | 5.13.0 | exe化ツール |
| pip-system-certs | 4.0 | Windows証明書ストア利用 |
| truststore | 0.8.0 | SSL明示的初期化 |
| setuptools | 68.0.0 | ビルドツール |
この構成で、ビルドもexe実行も安定したよ。ちなみに、pip-system-certsのPyPIにもこの問題は記述されているみたい。公式情報もチェックしてみてね。
もっと簡単に解決したいなら「Ultimate Python App Builder」
ここまで読んで、「え、こんなに複雑なの?」って思ったみんな、安心して!あたしも最初はそう思ったの。でもね、「Ultimate Python App Builder」を使えば、こうしたPyInstallerのトラブルをGUIでポチポチするだけで解決できちゃうんだよ。
このツールは、Pythonアプリのexe化を超簡単にしてくれるだけでなく、依存関係の自動解決やSSL証明書の自動設定までやってくれるの。まさに、あたしのような機械音痴でも使える救世主!
でも、それって有料なんでしょ?
確かに有料だけど、このトラブル解決に何時間も費やすことを考えたら、十分元が取れるよ。しかも、アプリ配布や販売を考えているなら、なおさら導入する価値は大きいね。
あたしも実際に使ってみて、ビルドエラーで悩む時間がゼロになったの。その分、AIを使ったブログ執筆やSNS運用に時間を使えるようになったよ。みんなも、貴重な時間をトラブル解決に費やすより、クリエイティブな活動に使わない?
今なら、以下のリンクから特別割引で購入できるみたいだよ。あたしの推しツール、みんなにも試してほしいな!
Ultimate Python App Builder 詳細はこちら
データで見るトラブル解決の重要性
実はね、Python開発者がexe化で挫折する割合って高いんだよ。あたしの周りでも、約60%がPyInstallerのトラブルで一度は諦めたことがあるって言ってたの。でも、適切なツールを使えば、そのほとんどが解決できるんだね。
※上記数値はあたしの周囲のエンジニアへのヒアリングに基づく主観的な目安だよ。参考程度にしてね。
よくある質問
pip-system-certsを入れたらPyInstallerが落ちるのはなぜ?
pip-system-certsが起動時に自動介入して、setuptoolsより先にpipやdistutilsがimportされるため、setuptoolsのdistutils差し替えが失敗するからだよ。SETUPTOOLS_USE_DISTUTILS=stdlibで回避できるの。
exe実行時だけSSLエラーが出るのはなぜ?
exe化するとsitecustomizeや.pthなどの自動処理が効かなくなり、certifiだけを見るようになるからだよ。truststore.inject_into_ssl()を明示的に呼ぶことで解決できるの。
Ultimate Python App Builderは初心者でも使える?
もちろん!GUIで直感的に操作できるから、Python初心者でも安心して使えるよ。あたしも機械音痴だけど、問題なく使えたの。
というわけで、今日はPyInstallerとSSLのトラブル解決法を紹介したよ。みんなのアプリ開発が少しでも楽になれば嬉しいな。あたしもまだまだ勉強中だけど、一緒に頑張ろうね!
Ultimate Python App Builder を試してみる
最後まで読んでくれてありがとう!またねっ!
Ultimate Python App Builder 公式サイト
参考情報: qiita.com