KNOWLEDGE - COLUMN ナレッジ - コラム

NuitkaでPythonプログラムを配布してみよう

コラムイメージ

関連するソリューション

システム開発

グローバルイノベーションセンター
テクニカルスペシャリスト 黒住 好忠

こんにちは。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.cmdhello.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
    x = np.arange(100)
    y = np.log1p(x)
    
    # pandas
    df = pd.DataFrame({"x": x, "y": y})
    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を下記にまとめています。(全て外部リンク)

当サイトの内容、テキスト、画像等の転載・転記・使用する場合は問い合わせよりご連絡下さい。

エバンジェリストによるコラムやIDグループからのお知らせなどを
メルマガでお届けしています。

メルマガ登録ボタン


黒住 好忠

株式会社インフォメーション・ディベロプメント フェロー

この執筆者の記事一覧

関連するソリューション

システム開発

関連するナレッジ・コラム

我が家のIoT化 ~スマートスイッチを導入してみた

台湾訪問から考えるWi-Fi7の進化とは

仮想通貨の現状 ~新たな潮流とその背景