以下の内容はhttps://uepon.hatenadiary.com/entry/2025/06/18/164954より取得しました。


【Python exe化】WindowsでNuitkaを使った実行ファイル作成方法

【2025.06.20 追記】Windows版のNuitkaでrequestsライブラリが動作しないと記載していましたが、Store版Python3.10にバージョンダウンしたところ無事に動作を確認しました。

先日は、WSL環境でNuitkaでの実行ファイルの作成にチャレンジしました。ただ、作成されたファイルは、そのままではWindows上で実行は出来ない状態でした。そこで今回は、Windowsネイティブ環境でNuitkaを使用した実行ファイル作成についても実験してみます。 これにより、WSL環境とWindowsネイティブ環境の両方で実行ファイルを作成できるようになり、比較的多くの環境で使用できる配布物を作成することが可能になります。

今回はPowerShellを主要なコマンドラインツールとし、Nuitkaの処理をWindowsネイティブ環境で活用するための手順、ベストプラクティス、そして実際に遭遇したトラブルとその解決策を記録していきます。

【参考】WSLでのNuitkaを使用した実行ファイルの作成

uepon.hatenadiary.com

基本的には上記の記事をベースにしているので、細かい部分はこちらを参照してください。

Windows特有の話

Nuitkaは、PythonコードをC言語ソースコードに変換し、それをネイティブの機械語コンパイルする、正真正銘のPythonコンパイラで以下のような特徴があります。

WSLビルドとネイティブWindowsビルドの違い

WSL上でNuitkaを実行して生成されるのは、WindowsネイティブのEXE形式のファイル(.exe)ではなく、LinuxネイティブのELF (Executable and Linkable Format) 形式のバイナリです。このELF形式のバイナリは残念ながらWindows上で直接実行することはできません。

先日、試したWSLでのビルドでは、確かに app.bin というファイルが生成されていましたが。Windows側ででダブルクリックしても何も起こりませんでした。

今回は、Windows環境とPowerShellを使用して、真のネイティブWindows実行ファイルを作成をしていきます。

1. コンパイルWindows開発環境の準備

1.1. 基礎環境の構築

適切なPythonバージョンの選択

Nuitkaは幅広いPythonバージョンに対応していますが(Python 3.4~3.13など)、常に最新バージョンが最適とは限りません。新しいPythonがリリースされた直後は、Nuitkaがまだ実験段階で、それによってエラーの原因となる可能性もあります。この点は覚えておきましょう。

1.1.1 Pythonの公式インストーラの使用

python.org の公式サイトから、Windows向けのインストーラ("Windows installer (64-bit)" を推奨)をダウンロードし、インストールしてください。

Add python.exe to PATHチェックボックスを必ずオンにしてください。これを忘れると、PowerShellPythonコマンドを認識できず、手動で環境変数を設定する手間が発生します。

1.1.2 Microsoft Store版Pythonの使用

【2025.06.20追記】※Store版の最新バージョンである3.13では一部ライブラリ(代表例:requests)で実行時のエラーが発生するようです。もしインストールされている場合にはアンインストールしてバージョンダウンしてください。現時点でのおすすめはバージョン3.10あたりではないかと思います。

最近ではPowerShell上でPythonコマンドを実行し、インストールされていないことが認識されると、MicrosoftStore経由(以降Store版)Pythonをインストールするように促されます。ストアのダイアログボックスからインストールしても同様にPythonのインストールが可能です。

ネットの検索ではStore版Pythonは使用不可とされていましたが、私が試したところ問題なく変化ができていました。

検証結果(Python 3.13、2025年6月時点)

  • Store版 + MSVC … 動作確認済
  • Store版 + MinGW64 … 動作できず - Python 3.13が新しいためか?今後の対応で改善される可能性あり?

Store版Pythonは、MSVCとの組み合わせて使用可能です。 MinGW64との組み合わせについては、NuitkaPython 3.13対応が進むにつれて改善されるのでは🤔と思います。

今回はMicrosoftStore版Python + MSVCの環境で試しています。

インストールしたPythonの動作確認

インストール完了後、PowerShellを開き、以下のコマンドを実行してPythonとpipが正しく認識されていることを確認します。

PS> python --version
PS> pip --version

バージョン番号が正しく表示されれば、Pythonの準備は完了です。

1.2. Cコンパイラのセットアップ

Nuitkaのメインの処理は、PythonコードをC言語ソースコードに変換しコンパイルする処理です。そのため、システムにはCコンパイラが必須です。

MSVC(Microsoft Visual C++)のインストール

インストーラーは簡単に入手できるのですが、インストール作業はちょっと面倒です。

インストール手順

以下のVisual Studio公式サイトからBuild Tools for Visual Studioをダウンロードして

visualstudio.microsoft.com

ダウンロードしたファイルを実行します。

インストーラーが起動するので【C++によるデスクトップ開発】と画面右側の【インストールの詳細オプション】を選択し

【インストール】ボタンをクリックします。

Visual Studio Build Toolsのインストールは約11GBのストレージが必要になります。ダウンロードにも時間がかかるので注意してください。

インストールが完了したら一度PCを再起動します。

再起動後、念の為以下でコンパイラがあるかを確認します。

田キーを押して、x64 Native Tools Command Prompt for VS 2022を起動し

whereコマンドでcl.exe(コンパイラ)のパスを調べます。

PS> where cl

Nuitkaは、システムにMSVCがインストールされている場合、それを自動的に検出して優先的に使用します。

別の選択肢であるMinGW64について

Nuitkaは、動作するシステムでMSVCが見つからない場合、自動的にMinGW64のCコンパイラをダウンロードしてセットアップする処理を行います。実行されたバイナリも高速という情報もありました。

便利なMinGW64ですが、ちょっとだけ注意点があります。

Store版 Python3.13ではコンパイルに失敗するようです(実験済)。実験はしてませんが、Pythonのバージョンダウンをしたほうがよいのかもしれません。

安全策をとるならVisual Studio Build Tools (MSVC)をインストールするべきでしょうか。

1.3. プロジェクトの準備

あとはプロジェクトとなるディレクトリなどを設定することになります。ただ、Windowsでは、セキュリティ上の理由からPowerShellスクリプト(psファイル)の実行が制限されるので、注意が必要です。

PowerShellでvenvを使用して仮想環境を構築する手順

# プロジェクトディレクトリの作成と移動
PS> mkdir MyNuitkaProject
PS> cd MyNuitkaProject

# 仮想環境の作成
PS> python -m venv venv

# ※管理者権限でPowerShellを開き、以下を実行
PS> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

# 仮想環境の有効化(ここで問題が発生する可能性があります)
PS> .\venv\Scripts\Activate.ps1

仮想環境の終了

作業が終わったら、以下のコマンドで仮想環境を抜けます。

PS> deactivate

2. 実行ファイル「Hello, World!」を作成

環境が整ったことを確認するために、簡単なプログラムをコンパイルしてみましょう。 このセクションは、WSLでの失敗体験とは対照的に、ネイティブビルドがいかに確実であるかを確認します。

2.1. Nuitkaのインストール

先ほど有効化した仮想環境内にNuitkaをインストールします。

PS> pip install -U nuitka

2.2. Pythonスクリプトの準備 (hello.py)

以下の内容で hello.py というファイルを作成します。

print("Hello, World!")
print("Pythonアプリをexe化します!")
input("Enterで終了...")

最後の input() がないと実行後画面スクロールされる可能性がありますので念の為に入れています。

2.3. コンパイルコマンドの実行

PowerShellで以下のコマンドを実行します。

PS> nuitka --onefile .\hello.py
PS> .\hello.exe

その他にも前回の例を実行してみましたが、無事に動くようです。

※requestsライブラリを使用したプログラムは相性が良くないのかうまく動作しません。Strore版の3.10あたりにバージョンダウンをさせてください。

仕方ないので今回は暫定的にurllibを使用して動作しています。Pythonをバージョンダウンすれば参照エントリーと同じソースファイルで動作可能です。

PS> nuitka --onefile --follow-imports web_app.py
# web_app.py - urllib使用版(Nuitkaコンパイル対応)
"""
web_app.py
気象庁 JSON から "今日〜明後日" の天気と直近 POP(降水確率) を取得
標準ライブラリのurllibを使用してNuitkaコンパイルの問題を回避
"""
import urllib.request
import urllib.error
import json
from datetime import datetime, timezone, timedelta

AREA_CODE = "130000"               # ← 他県にしたい場合はコードを変える
URL = f"https://www.jma.go.jp/bosai/forecast/data/forecast/{AREA_CODE}.json"

def fetch_forecast(area_code: str = AREA_CODE) -> list[tuple[str, str, str]]:
    """気象庁 JSON から (時刻, 天気, 降水確率) のタプルを返す"""
    url = f"https://www.jma.go.jp/bosai/forecast/data/forecast/{area_code}.json"
    
    try:
        with urllib.request.urlopen(url, timeout=5) as response:
            data = json.loads(response.read().decode('utf-8'))
    except urllib.error.HTTPError as e:
        raise Exception(f"HTTP Error {e.code}: {e.reason}")
    except urllib.error.URLError as e:
        raise Exception(f"URL Error: {e.reason}")
    
    # 日ごとの天気(3日分): timeSeries[0]
    ts_weather = data[0]["timeSeries"][0]
    times = ts_weather["timeDefines"]          # ISO8601 +09:00
    weathers = ts_weather["areas"][0]["weathers"]
    
    # 直近 6h ごとの降水確率: timeSeries[1]
    # 0,6,12,18 時の計 5 コマ分が入っている(行政区により数は変わる)
    pops = data[0]["timeSeries"][1]["areas"][0]["pops"]
    
    # 「今日・明日・明後日」用に先頭 3 要素だけ使う
    return list(zip(times[:3], weathers[:3], pops[:3]))

def main() -> None:
    try:
        for time_iso, weather, pop in fetch_forecast():
            # ISO8601 → datetime へ (JST)
            dt = datetime.fromisoformat(time_iso).astimezone(
                timezone(timedelta(hours=9))
            )
            print(f"{dt:%Y-%m-%d %H:%M} : {weather.replace(' ','')} / 降水確率 {pop}%")
    except Exception as e:
        print(f"エラー: {e}")

if __name__ == "__main__":
    main()

コンパイル時の処理

コマンドが実行されると、Nuitkaは以下の処理を自動的に行います。

  1. hello.py を解析し、C言語ソースコードに変換
  2. 内部的にSConsというビルドツールを呼び出し
  3. SConsがCコンパイラ(MSVCまたはMinGW64)を起動
  4. 生成されたCコードをコンパイル
  5. 必要なライブラリとリンクし、最終的な単一の実行ファイル hello.exe を生成

おわりに

NuitkaでネイティブなWindowsの実行ファイル(バイナリ)の作成を進めることができました。事前のコンパイラのインストールなどは必要ですが、配布などにもかなり融通が聞くようになってのではないかと感じます。

それにしても、requestsライブラリが使用できないとは思いませんでした。Store版Pythonが原因なのかもしれないですし、Python3.13との相性も間変えられます。また、そもそもNuitkaとの相性が悪いのかもしれません(たぶん、Linuxでは大丈夫なので前者2つのどちらかだと思いますが🤔)

【2025.06.20追記】※Store版の最新バージョンである3.13では一部ライブラリ(代表例:requests)で実行時のエラーが発生するようです。ダウングレードしてください。現時点でのおすすめはバージョン3.10あたりではないかと思います。

参考リンク

uepon.hatenadiary.com




以上の内容はhttps://uepon.hatenadiary.com/entry/2025/06/18/164954より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14