exe変換 (py2exe) | Python-izm

exe変換 (py2exe)

Pythonのスクリプト(.py)をWindowsの実行形式であるexeファイルへ変換することができます。py2exeを使用し、exe化を行ってみましょう。

py2exeのインストール

Python 3.3 / 3.4では

下記コマンドを入力しpy2exeをインストールしてください。
※これはpipがインストールされていることを前提としています。インストールしていない場合はpipの使い方とインストールを参照してください。
※py2exeは2017年9月時点ではPython 3.5 / 3.6 には対応していません。インストールすることはできますが、exe変換中にエラーが発生します。

pip install py2exe

Python 2系では

下記リンクからインストーラをダウンロードしてください。

A distutils extension to create standalone windows programs from python scripts.

ダウンロード終了後、インストールを行います。全てデフォルト設定で構いません。

exe変換例

pyからexeへの変換にあたり、必要なものは下記4つとなります。

  1. Python (Python実行環境)
  2. py2exe (変換ライブラリ)
  3. main.py(変換元ソースファイル、ファイル名は任意)
  4. setup.py(セットアップスクリプト、ファイル名は任意)

1つ目と2つ目はすでにあるはずなので、3つ目と4つ目を用意しましょう。まずはソースファイルです。

import datetime

now = str(datetime.datetime.today())
with open('nowtime.txt', 'w') as out:
    out.write(now)

上記ソースコードは、実行するとnowtime.txtというファイルに現在時刻を出力するプログラムです。次はセットアップスクリプトです。

from distutils.core import setup
import py2exe

option = {
    'compressed': 1,
    'optimize': 2,
    'bundle_files': 1,
}

setup(
    options = {
        'py2exe': option,
    },
    console = [
        {'script': 'main3.py'}
    ],
    zipfile = None,
)

変換オプションやソースファイル名を記述します(オプションについての詳細は後述)。準備が完了したらコマンドラインにて下記コマンドを実行します。

python setup.py py2exe

コマンド実行後、コンソールに処理経過が出力されますので暫く待ちましょう。変換処理終了後distディレクトリが生成されているはずです。変換されたexeファイルはdistディレクトリ内にmain.exeというファイル名で保存されています。main.exeファイルを実行し、同一ディレクトリへnowtime.txtというファイル名にて現在時刻が出力されていれば成功です。

変換オプション詳細

セットアップスクリプトの変換オプションを詳しく見てみましょう。先程変換に使用したファイルです。

from distutils.core import setup
import py2exe

option = {
    'compressed': 1,
    'optimize': 2,
    'bundle_files': 1,
}

setup(
    options = {
        'py2exe': option,
    },
    console = [
        {'script': 'main3.py'}
    ],
    zipfile = None,
)

上記ファイルでは3つオプションを指定しています。

  • compressed – 出力を圧縮するかしないか
  • optimize – 最適化するかしないか
  • bundle_files – exeファイルにランタイムdllを含めるか含めないか

compressedおよびoptimizeについては、おそらくどのような状況でも上記指定にて問題無いかと思われます。残るbundle_filesは状況によって使い分けが必要となりそうです。

配布先や諸々の状況において最適なオプションを指定しましょう。上記以外のさらに細かい設定も出来る様ですが、ここでは割愛します。