2022年12月24日

PyInstaller を使ってみる

 Python スクリプトを単体アプリにする PyInstaller を試してみた。けっこういけるやん、というのが第一印象です。

 venv を使って必要なライブラリを揃える。今回は故あって、Excel ファイルを操作するための openpyxl を使った。同じ環境に、PyInstaller をインストールする。

(Excel) $ pip3 install openpyxl
(Excel) $ pip3 install pyinstaller

 次のように Python スクリプトを指定すれば実行ファイルが作成できる。

(Excel) $ pyinstaller assign_labs.py --onefile -w

 アプリケーションパッケージができる。9.2 MB。コンパクトになりました。

20221224-2.jpg

 Windows 10 上では、コマンドプロンプトから実行する。MSYS2 上の bash から実行したかったけど、簡単じゃなさそうだったので断念しました。

(Excel) > pip install pyinstaller

 ところが、ERROR: Could not install packages due to an OSError: [Errno 22] というエラーが出てしまった。よく見ると、このエラーが出た時に Microsoft Defender から「ウィルス対策で脅威が見つかりました」というメッセージが出ている。

20221224-1.jpg

 少し前のバージョンをインストールしたら通りました。バージョンを探すには、pip install pyinstaller== とする。バージョンが指定されていないというエラーになるが、エラーメッセージの中に現在入手できるバージョンが表示される。

(Excel) > pip install pyinstaller==
ERROR: Could not find a version that satisfies the requirement pyinstaller== (from versions: 2.0, 2.1, 3.0, 3.1, 3.1.1, 3.2, 3.2.1, 3.3, 3.3.1, 3.4, 3.5, 3.6, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.5.1, 4.6, 4.7, 4.8, 4.9, 4.10, 5.0, 5.0.1, 5.1, 5.2, 5.3, 5.4, 5.4.1, 5.5, 5.6, 5.6.1, 5.6.2, 5.7.0)
(Excel) > pip install pyinstaller=5.6.2

 作成方法は同じ。

(Excel) > pyinstaller assign_labs.py --onefile -w

 exe ファイルができます。9.02 MB。Mac 版とだいたい同じサイズですね。

20221224-3.jpg

 Linux (Mint 21) でもやってみました。Python スクリプトを単体で実行させるとき、入出力を行うための GUI が必要です。今回は、ディレクトリを指定するダイアログと、結果を表示するメッセージボックスがあればよいので、tkinter を使っています。Linux Mint には tkinter がデフォルトで入ってなかったので、次の1行が必要でした。

$ pip3 install python3-tk

 同じく venv を作成して、openpyxl と pyinstaller をインストールして、実行ファイルを作ってみます。

(Excel) $ pyinstaller assign_labs.py --onefile -w

 11.1 MB。少し大きめです。

20221224-4.jpg

 ライブラリの依存関係を調べてみた。

$ ldd dist/assign_labs
    linux-vdso.so.1 (0x00007ffe80d74000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0e6af3d000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f0e6af21000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0e6af1c000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0e6acf4000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f0e6af59000)

 この依存関係なら、他の Linux ディストリビューションでも実行できそうだけど、どうなんだろう。Fedora Linux 37 でやってみたら、動いた!

20221224-5.jpg

 なかなかいいですね。Python は今まで「自分一人で使うにはいいけど、他の人に使ってもらう時にハードルが高すぎる」と思っていたけど、単独で実行できるアプリケーションバイナリを Mac/Win/Linux で作れるんだったら、その問題はクリアできたと言えそうです。あとは、インデントで制御構造が決まる気持ち悪さを自分が我慢できるかどうかだな(笑)

タグ:Mac Python Linux
Posted at 2022年12月24日 20:29:49
email.png