前提
nuitkaは、Pythonコードをexe化することができるツールです。
Pythonをexe化するツールとしては他にPyInstallerとかもあるんですが、スタンドアローンで動かす場合、スタートアップにかかる時間がnuitkaが最も優れていた(僕調べ)ので、選ばれたのはnuitkaでした。
当方実行環境は以下の通りです。
項目 | 値 |
---|---|
OS | Windows 10 |
Pythonバージョン | 3.12, 3.13がインストール済み |
エラー発生
nuitkaのインストールも終え、意気込んで次のコマンドを実行しました。
(sample.py の部分は適宜読み替えてください)
nuitka --standalone sample.py
しばらく処理が進んだのち、以下のようなエラーが表示されました。
FATAL: Sorry, non-MSVC is not currently supported with Python 3.13,
due to differences in layout internal structures of Python.
Newer Nuitka will work to solve this. Use Python 3.12 or
option "--msvc=latest" as a workaround for now and wait
for updates of Nuitka to add MinGW64 support back.
エラーの内容としては文字通りで、non-MSVC というのが Python 3.13 に対応していないというもの。
すみませんが non-MSVC には明るくないので、そっちのモジュール方向からの解決方法があるかもしれないですが、私はPythonバージョンを適正なものに変更することで解決する方向としました。
エラー解消
実行環境は Python 3.13 を主として利用しつつ、幸いにも、以前利用していた旧バージョンの Python 3.12 もインストールしていました。
そこで、nuitka を Python 3.12 で実行するため、Python 3.12 のexeのフルパスを調べ、改めて次のようなコマンドで実行しました。
(Python 3.12 のexeのパス) -m nuitka --standalone sample.py
無事にエラーも解消されました。めでたし。
補足: 僕がonefileオプションを使わない理由
nuitka含めてPythonコードのexe化ツールでは、onefileオプションが使える場合があります。
onefileオプションは、出力成果物のexeを一つの実行ファイルにまとめるというものです。
逆に、このonefileオプションを付けないと、出力成果物としてdllファイル等のファイルが同梱され、exe実行に必要なファイルが多くなります。
出力したexeを配布する用途があったりすると、一つのexeファイルにまとまっている方が便利そうではあるのですが、以下の点も留意する必要があります。
1. 単一の実行ファイルにすることでexe実行時のスタートアップに時間がかかる (場合が多い)
onefileオプションを付与すると、そのオプションを付けなかった場合の出力成果物を圧縮して一つにまとめているようです。
つまり、onefileオプションによって出力されたexeファイルを実行すると、「圧縮されたファイル群を解凍」→「解凍されたexeを実行」という流れになるので、最初の解凍処理分だけオーバーヘッドがかかるということですね。
Pythonコード側でimportしているライブラリの数や種類によっても初期処理の時間は変わるみたいなので、ここは実際のコードで試してみて確認するのが良さそうです。
参考1:PyInstaller より圧倒的に優れている Nuitka の使い方とハマったポイント | つくみ島だより
2. exeファイルがウイルス判定されづらくなるらしい
自身で検証はできていないのですが、以下の明日太さんという方が書かれた記事が分かりやすいため、ご紹介いたします。
参考2:We Love Python (7) ~Nuitkaさんはマルウェアじゃない!&来年に向けて | note / 明日太さん
ちょっとビビったのが、“nuitka” で検索すると、予測変換に "ウイルス" が出てきます。
どうやら、nuitkaで出力したexeをいざ実行しようとした際に、Windowsで怪しいファイルだと認識されてしまうことが少なくないようです。
参考2で示した記事によれば、onefileオプションを外すだけでもexeがウイルスと判定されるケースが少なくなるという事実が示されています。
僕はexeを身内に配布したかったので、配ったexeがウイルス判定されないようにonefileオプションをつけなかったということですね。