Pythonスクリプトのexe化は沼
Pythonスクリプトのexe化を行うための環境構築の備忘録
環境
>python.exe --version
Python 3.8.10
exe化ツールは何を使う?
Pythonのスクリプトをexe化するツールは複数あり、主なものとしてPyInstaller, cx_Freeze, Py2exe, Nuitkaがある。
今回はQiitaの各タグで最も記事が多いPyInstallerを使用する。
PyInstallerをオフラインインストール
最初にパッケージファイルをダウンロードする。
pip download -d ./ pyinstaller
本環境では以下のパッケージがダウンロードされた。
- altgraph 0.17.4
- importlib-metadata 8.0.0
- packaging 24.1
- pefile 2023.2.7
- pyinstaller-hooks-contrib 2024.7
- pyinstaller 6.9.0
- pywin32-ctypes 0.2.2
- setuptools 70.2.0
- zipp 3.19.2
venvで環境を分ける
インストールした素の状態でPyInstallerを使用しても良いが、端末にインストールされているライブラリすべてをexeファイルに取り込んでしまい、容量がデカくなってしまう。 これを回避するためにvenvを使用して環境を分ける。
python.exe -m venv .venv
環境を分けたらそこに入る
.\.venv\Scripts\activate
入ると以下の表示に変わる。
(.venv) C:\test>
環境から出る場合にはベタ打ちでdeactivate
する。
インストール
ダウンロードされたファイルを用いてインストールする。使用している2つのオプションは「インデックスを無視して--find-links
で指定したリンクからパッケージを探す」という意味である。(多分)
pip install --no-index --find-links=./ pyinstaller
インストールしたパッケージを確認する。
(.venv) C:\test>pip list
Package Version
------------------------- --------
altgraph 0.17.4
importlib-metadata 8.0.0
packaging 24.1
pefile 2023.2.7
pip 21.1.1
pyinstaller 6.9.0
pyinstaller-hooks-contrib 2024.7
pywin32-ctypes 0.2.2
setuptools 56.0.0
zipp 3.19.2
exe化テスト
PyInstallerがインストールされたので以下のスクリプトをexe化してみる。
import sys
print('Hello!')
sys.exit()
ビルド
pyinstaller exetest.py -F
実行
(.venv) C:\test>.\dist\exetest.exe
Hello!
できたぁ
依存ライブラリが多いパッケージを使用する場合
機能が豊富なパッケージを使用する場合、依存するライブラリも多い場合がある。しかし、venvで環境を分けた場合はいちいちパッケージをインストールしなければならない。それは面倒
まず、pip show <package>
を実行してRequiresにある依存ライブラリの一覧を出力する。
C:\test>pip show <package>
Name: <package>
~省略~
Requires: lib1, lib2, lib3, .......
次に--hidden-import
オプションを依存ライブラリの数だけ列挙する。なお、--onefile
オプションも使用できるがexeファイルの容量がライブラリ分デカくなるので注意
pyinstaller exetest.py --hidden-import lib1 --hidden-import lib2 --hidden-import lib3.....
multiprocessingとの併用
まだ
WindowsDefender
まだ