関連するソリューション
システム開発
グローバルイノベーションセンター
テクニカルスペシャリスト 黒住 好忠
こんにちは。Technicalスペシャリストの黒住です。
最近、Pythonの人気がさらに加速していますね。特に、AI開発やデータ分析においてはPythonの利用頻度が非常に高くなっています。
しかし、「Pythonプログラムを配布する」部分では問題が多いのではないでしょうか。そこで、今回は「Pythonプログラムをexe形式で配布する方法」についてご紹介します。
Pythonでexeファイルを作成する方法
C#やC/C++などのプログラミング言語では、実行可能なexe形式のプログラムファイルを作成できますが、Pythonにはexeファイルを作成する機能はありません。
そこで、Pythonのコードを実行可能な状態で配布したい場合は、他のツールを使用してexeファイルを作成する必要があります。exe化のツールはいくつか存在しますが、有名なものは以下の通りです。
- PyInstaller
- Py2exe
- cx_Freeze
- Nuitka
知名度では「PyInstaller」が群を抜いていますが、PyInstallerには「動作が非常に遅い」という欠点があります。また、配布するファイルサイズも大きくなりがちです。
そこで今回は、あまり知られていない「Nuitka」というツールを取り上げます。Nuitkaには、他のツールと比べて「非常に高速に動作する」プログラムを生成できるという特徴があります。
Nuitkaの特徴
Nuitkaには以下のような特徴があります。特に、Pythonで書かれたコードを「C言語のコードに変換し、ネイティブコードに再コンパイルする」という点が、他のツールにはないメリットになります。
- オープンソースのApache 2.0ライセンスで公開されている(商用利用可能)
- Python 2.6~2.7、3.3~3.10に対応(2022年12月時点)
- Linux、macOS、Windowsなどの環境に対応
- 内部でC言語に変換して再コンパイルしているため非常に高速に動作する
- C言語への変換やコンパイル処理が必要なため、ビルド自体は少し時間を要する
Nuitkaの使い方
ここからは、Nuitkaの具体的な使い方について見ていきます。
インストール方法
Nuitkaはpip経由で簡単にインストールできます。また、コンパイルに必要なC言語コンパイラなども、Nuitkaが自動的にダウンロードするため、インストールは容易になります。
python -m pip install nuitka
簡単なプログラムのexe化
まずは「Hello, Python!」とメッセージを表示するだけの簡単なPythonプログラムをexe化してみましょう。
ここでは、以下の簡単なPythonプログラムを使用します。
# hello.py
print("Hello, Python!")
作成したPythonプログラム(hello.py)は、以下コマンドでビルドできます。
# Nuitkaを使ったビルド
nuitka hello.py
ビルドが完了すると、hello.cmd
とhello.exe
が生成されます。
なお、ここで生成されたexeファイルは、「ビルドした環境に存在するPython環境を利用する」前提で作成されます。つまり、exeファイルを配布する際には、配布先の環境に同じPython環境が存在する必要があります。配布先の環境にPython環境が存在しない場合は、exeファイルは動作しません。
配布先でも動くexeファイルの作成
配布先にPythonがインストールされていなくても実行できるようにするには、以下のように、コンパイルオプションに--standalone
を追加します。
# Python環境がなくても動作するexeファイルを作成する
nuitka --standalone hello.py
ビルドが完了すると、hello.dist
というフォルダが作成され、そのフォルダの中にhello.exe
が生成されます。
このように、--standalone
オプションを付けてビルドすると、実行に必要な全てのファイルが~.dist
フォルダに格納されるようになります。このフォルダの中身を丸ごと配布すれば、Pythonがインストールされていない環境でもプログラムを実行できるようになります。
なお、フォルダ名は自由に変更できます。
ファイルを1つにまとめたい
配布可能なファイルを作成すると、~.distフォルダに数十個のファイルが含まれるようになりますが、場合によっては「1つ実行ファイルにまとめたい」ケースもあると思います。
この場合は、--onefile
というオプションを指定してビルドします。
# 1つの実行ファイルにまとめる
nuitka --onefile hello.py
ビルドが完了すると、「ソースフォルダと同じ場所に」exeファイルが生成されます。生成されたexeファイルを配布すれば、Pythonがインストールされていない環境でもプログラムを実行できます。
なお、~.distフォルダなども作成されますが、ビルドの過程で生成されるフォルダになるため、.distフォルダなどは、--onefile
オプションを付けてビルドした場合、配布対象に含める必要はありません。
numpyなどを使う場合
numpyなど、利用しているパッケージによっては、実行時にDLLファイルが必要になるケースがあります。このようなケースに対して、Nuitkaでは「プラグイン」という形で、代表的なパッケージを組み込めるようになっています。
必要なプラグインは--enable-plugin
オプションで追加できます。
なお、Pythonプログラムの中で、「プラグイン指定が必要なパッケージを使用していて、プラグインの指定を忘れていた場合」、ビルド時にNuitka-Plugins:WARNING: Use '--enable-plugin=numpy' for: Numpy may miss DLLs otherwise.
のような警告メッセージが表示されるので、事前にプラグインの指定漏れに気づくことができます。
ここでは、以下のようなnumpyを使ったプログラムを使用します。
# numpyを使うサンプルソースコード
import numpy as np
import pandas as pd
# numpy
= np.arange(100)
x = np.log1p(x)
y
# pandas
= pd.DataFrame({"x": x, "y": y})
df print(df.describe())
上記ソースコードではnumpyを利用しているため、以下のコマンドで、numpyプラグインを有効化した状態でビルドを行います。
# numpyプラグインを有効化してビルドする方法
nuitka --onefile --enable-plugin=numpy hello.py
numpy意外にも、2022年12月時点で「anti-bloat, data-files, delvewheel, dill-compat, dll-files, enum-compat, eventlet, gevent, gi, glfw, implicit-imports, kivy, matplotlib, multiprocessing, no-qt, numpy, options-nanny, pbr-compat, pkg-resources, pmw-freezer, pylint-warnings, pyqt5, pyqt6, pyside2, pyside6, pywebview, tensorflow, tk-inter, torch, trio, upx」のようなパッケージが、Nuitkaのプラグインとして指定可能です。
なお、Nuitkaで利用できるプラグインの一覧は、下記コマンドで確認できます。
# 利用できるプラグインの確認
nuitka --plugin-list
複数のソースファイルが存在する場合
プログラムを複数のソースファイル(モジュール)に分割している場合は、--follow-imports
オプションで利用しているモジュールが取り込まれるようにします。このオプションを指定すれば、利用しているモジュールを自動的に探索して、ビルドが行われるようになります。
# 利用しているモジュールを自動的に探索して取り込む方法
nuitka --onefile --follow-imports main.py
その他のオプション
実際のアプリケーションでは、ソースコード以外に、「独自の設定ファイルやリソースファイルなどを含めたい」ケースがあると思いますが、このような場合は--include-data-files
オプションで任意のファイルを取り込むことが可能です。
他にも、実行ファイルのアイコンやプロパティ設定、最適化に関するオプションなど、上記で取り上げていないオプションが複数存在します。そのため、詳細については、下記リンク集の「Nuitka ユーザーマニュアル」も併せてご参照いただければと思います。
最後に
Nuitkaを使えば、Pythonのコードを実行可能なexeファイルに変換することが可能で、これによりPythonがインストールされていない環境でもPythonプログラムを実行できるようになります。
特に、Nuitkaには「PythonのコードをC言語のコードに変換し、ネイティブコードに再コンパイルする」という他のツールにはない特徴があるので、非常に高速に動作するプログラムを作成できます。
C言語へのコード変換やコンパイル処理が入るため、プログラムのビルド自体には多少の時間を要しますが、実行時のパフォーマンスは非常に優れているので、ぜひNuitkaを試してみてくださいね。
それではまた、次回のコラムでお会いしましょう。
リンク集
この記事で取り上げたツールなどのURLを下記にまとめています。(全て外部リンク)