LoginSignup
4
8

More than 3 years have passed since last update.

.pyファイルを.exeファイルにする方法

Posted at

業務で必要になり調べたり試したりしてみたので、記録がてら初投稿。
py2exeとpyinstallerを使用し、最終的にpyinstallerを使用しています。
記述は全てpipenvでの仮想環境下を想定しています。1
適宜読み替えてください。

誤っている箇所などあれば気軽にコメント等お願いします。

環境

  • Windows 10 version 2004 (May 2020 Update)
    • pipenv 2020.8.13
      • python 3.8.5
      • numpy 1.19.2
      • pandas 1.1.2
      • py2exe 0.9.3.2 or pyinstaller 4.0

py2exe

色々調べたところ、pyinstallerより軽量かつ高速!とあったので使用してみるも、pandasやscipyなどのモジュールがあると何故か依存ファイルに漏れが出て、実行時にimportエラーが出る。
(numpyは問題なかった。またGithub等で色々調べるとmatplotlibやQtPyなども問題になり得るみたい。)
使用していたpy2exeのバージョン(0.9.3.2)がリリースされた時点に合わせてライブラリをダウングレードしてみたりするも改善せず。
筆者はここでpy2exeを一旦見限った。

簡単なファイルで実行まで試したので、使い方だけサラッと説明します。

インストール

使用する環境、バージョンに合わせて.whlファイルをGithubからダウンロードしてくる。
その後、

$ pipenv install py2exe-0.9.3.2-cp37-none-win_amd64.whl

#非仮想環境下
$ pip install py2exe-0.9.3.2-cp37-none-win_amd64.whl

とするとインストールできる。
(pip install py2exeでもインストールできるが、古いバージョンになる。)

実行方法

  • setup.pyを、exe化したいファイルと同じ階層に作成(各種optionはここで指定。詳しくはGoogle先生迄)。
setup.py
    from distutils.core import setup
    import setuptools
    import py2exe

    setup(
        console = [{'script': 'xxx.py'}] # exe化するファイル
    )
  • exe化
    $ pipenv run python setup.py py2exe

これでdistディレクトリ下にhello.exeができる。

pyinstaller

pandasやnumpy等のライブラリを使っている場合、py2exeに比べて遅い・容量が大きいの二重苦で使用を避けていたが、py2exeが上で記したような感じだったのでこちらを使用することに。

参考:

インストール

$ pipenv install pyinstaller

#非仮想環境下
$ pip install pyinstaller

実行方法

  • ファイルをまとめずexe化する場合
    $ pipenv run pyinstaller xxx.py

結果

    .
    ├─build
    │  └─xxx
    └─dist
        └─xxx
            ├─xxx.exe  # 生成された実行ファイル
            ├─Include
            ├─numpy
            ├─pandas

実行にはxxx以下が全て必要。

  • ファイルをまとめてexe化する場合
    $ pipenv run pyinstaller xxx.py --onefile

結果

    .
    ├─build
    │  └─xxx
    └─dist
       └─xxx.exe  # 生成された実行ファイル

スッキリ。

pyinstallerで生成された.exeファイルの容量・実行時間について

簡単な.pyファイルを作って実験。環境は上と同じ。

  • 実験パターン

    • 'normal': ファイルをまとめずにexe化
    • 'onefile': ファイルをまとめてexe化
  • 使用ファイル

hello.py
    import sys
    import numpy
    import pandas

    with open('test.txt', 'w') as f:
        f.write(f'argv: {sys.argv}') # 引数がちゃんと渡せるか確認
  • 実行
$ pipenv run pyinstaller hello.py # --onefile
$ dist/hello.exe hello world 1 2 3
  • 出力ファイル
test.txt
argv: ['C:{PATH}\\hello.exe', 'hello', 'world', '1', '2', '3']

引数の渡し方は.pyの実行と同様で良さそう。

  • 結果
ファイル容量(distディレクトリ) 実行時間
normal 148MB <1s
onefile 55MB 10~20s

容量と実行時間がトレードオフっぽい。55MBでも十分大きいけど。

まとめ

python以外の言語で書かれた既存のソフトに学習済みの機械学習モデルを組み込んだりするときに使えるかもしれないが、容量の大きさと、今回使用していない他ライブラリとの依存関係などが気になるところ。
気が向いたらもう少し実験して追記します。


  1. exe化実行時に環境にあるライブラリは全てexeに含まれてしまい容量がバカみたいに大きくなるという記述があったので、pipenvを使用して最小限のライブラリをインストールし、実行している。 

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8