IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

Python pyinstallerで実行ファイル化(exe化)

どうも、nippa です。

python のライブラリの pyinsteller を使って配布用の実行ファイルの作成ができます。

プログラマを他人に渡したいが、ソースコード自体は渡したくないような場合に便利です。

少し使ってみたところ意外と便利だったため、まとめておこうと思います。

pyinstaller の公式を参考にしています。

環境

pyinstaller のインストール

  • pip でインストールする場合
pip install pyinstaller
  • Anaconda でインストールする場合
conda install pyinstaller

pyinstaller の基本

1 ファイルの python スクリプトの場合

pyinstaller [スクリプト名]

を実行するとdist/[スクリプト名]ディレクトリに実行ファイル化されたファイル群が作成されます。

配布する場合は、ディレクトリの中身をすべて渡す必要があります。

また、生成された実行ファイルを別環境で利用する場合は import している python ライブラリを別環境でもインストールが必要です。

コンソールへの出力が不要な場合は、-wを指定することでコンソール出力させなくすることができます。

pyinstaller -w [スクリプト名]

複数の python ファイルの1つの実行ファイル化

pyinstaller -F [スクリプト名]

Mac であれば app ファイル、Windows であれば exe ファイルがdist内に生成されます。

-Fもしくは--onefileオプションは macwindows 共通オプションになります。

pyinstaller の設定ファイルを利用

pyinstaller をインストールすると pyi-makespecというコマンドもインストールされます。

このコマンドは pyinstaller の設定ファイルを生成するコマンドになります。

pyi-makespec [スクリプト名]

オプションが色々あるので指定する、もしくは生成される spec ファイルを編集することで pyinstaller 実行時の設定を指定することができます。

spec ファイルからの pyinsaller の実行は以下のとおりです。

pyinstaller [specファイル名]

spec ファイルの設定

spec ファイルの内容は以下の通りです。

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['test.py'],
             pathex=['path'],
             binaries=[''],
             datas=[''],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='test',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='test')

実行ファイルの指定(--add-binary)

pyinstaller を実行する場合には、--add-binaryオプションで指定することができます。

Mac の場合

pyinstaller [スクリプト名] --add-binary "参照先のパス:ビルド時に配置する位置"

Windows の場合

pyinstaller [スクリプト名] --add-binary "参照先のパス;ビルド時に配置する位置"

また、spec ファイルに期日する場合はbinariespython のタプル形式で指定します。

('参照先のパス','ビルド時に配置する位置')

spec ファイルへの記述は以下のようになります。

binaries=[('../bin/test1', '../bin'), ('../bin2/test*', '../bin'),],

データファイルの指定(--add-data)

pyinstaller を実行する場合には、--add-dataオプションで指定することができます。

Mac の場合

pyinstaller [スクリプト名] --add-data "参照先のパス:ビルド時に配置する位置"

Windows の場合

pyinstaller [スクリプト名] --add-data "参照先のパス;ビルド時に配置する位置"

python ファイルを実行する際に必要なデータは、datasにてタプル形式で指定します。

('参照先のパス','ビルド時に配置する位置')

spec ファイルへの記述は以下のようになります。

datas=[('../data1/data*', '../data'), ('../data2/data.csv', '../data'),],

同梱するライブラリの指定(--hidden-import)

pyinstaller を実行する場合には、--hidden-importオプションで指定することができます。

Mac / Windows の場合

pyinstaller [スクリプト名] --hidden-import "ライブラリ名"

python ファイルを実行する際に必要なデータは、ライブラリは hiddenimports に list 形式で指定します。

hiddenimports = ['json', 'matplotlib.pyplot', 'matplotlib.dates']

hiddenimportsに指定することで、ライブラリが同梱されるため、別環境でライブラリのインストールが不要になります。

感想

python スクリプト配布用などに実行ファイル化を pyinstaller を使って行ってみました。

方法がわかると非常に簡単にできますね。

ぜひ、試してみてください。

ではでは、また次回。