QuickIR を cx_Freeze で Windows の EXEファイルにしてみた(3)
いよいよ最後のステップ。QuickIRをEXE化する。
7. QuickIR をEXE化する
さて、いよいよ本来の目的である QuickIR の EXEファイル化に取り掛かろう。
1) "QuickIR.py"
先ずは"QuickIR.py" プログラム(Pythonスクリプト)の修正からだ。EXEファイル名を"QuickIR.exe" としたいので、__name__ が'quickir__main__' の場合にもmain関数が呼び出されるように修正する。
if __name__ == '__main__' or __name__ == 'quickir__main__':
main()
|
それ以外に、Version番号を1だけ上げて 1.0.8とした。
2) setupスクリプト("cxFreeze_setup.py" )
cx_Freezeのsetupスクリプトは以下のようになる。
# -*- coding: utf-8 -*-
"""
This is a cx_Freeze setup.py script
Usage:
python cxFreeze_setup.py build
"""
import sys
import os
from cx_Freeze import setup, Executable
# Dependencies are automatically detected, but it might need fine tuning.
python_dir = r'C:¥Python35' # Python installed directory
includes = ['irkit', 'resolve_irkit']
include_files = [python_dir + r'¥DLLs¥tcl86t.dll',
python_dir + r'¥DLLs¥tk86t.dll',
r'images¥file_add.gif',
r'images¥file_delete.gif',
r'images¥file_post.gif',
r'images¥file_rename.gif',
r'images¥folder_add.gif',
r'images¥folder_delete.gif',
r'images¥folder_rename.gif',
r'images¥IRKit.gif']
pakages = ['os', 'sys', 'tkinter', 'pybonjour']
excludes = ['logging', 'distutils',
'multiprocessing', 'pydoc_data',
'test', 'unittest',
'xml', 'xmlrpc']
build_exe_options = {'includes': includes,
'include_files': include_files,
'packages': pakages,
'excludes': excludes,
'optimize': 2}
base = None
if sys.platform == 'win32':
base = 'Win32GUI'
os.environ['TCL_LIBRARY'] = python_dir + r'¥tcl¥tcl8.6'
os.environ['TK_LIBRARY'] = python_dir + r'¥tcl¥tk8.6'
exe = [
Executable('QuickIR.py', base=base, targetName='QuickIR.exe', icon='app.ico')
]
setup(name='QuickIR',
version='1.0.8',
description='QuickIR IRKit controller',
options={'build_exe': build_exe_options},
executables=exe)
|
includesリストには、"QuickIR.py" が importしている QuickIRのモジュールを指定している。
更に、取り込むファイル(include_filesリスト)には、Tcl/TkのDLLだけでなく QuickIRが使用している画像ファイルも加えている。
3) EXE化バッチファイル
QuickIRが使用している画像ファイルを取り込んでも、"QuickIR.exe" と同じ階層に置かれるだけで、このままではpy2appで Macアプリケーション化したときと同じ問題が発生する。QuickIR は imagesディレクトリ配下に画像ファイルがあると思っているので、画像ファイルが見つからなくなるという問題だ。そこで、今回も EXEファイル作成後に imagesディレクトリを作り、画像ファイルを imagesディレクトリ配下に移動させる(*1)。これを毎回手作業で行っていたのでは面倒なので、QuickIRをEXE化するバッチファイルを作成する。
バッチファイルはこんな感じになる。これを"make_exe.bat" というファイル名で保存する。
@echo off
setlocal
python cxFreeze_setup.py build
rem
rem Created QuickIR.exe file under the follwing directory
rem 32bit: build¥exe.win32-3.5
rem 64bit: build¥exe.win-amd64-3.5
rem
cd build¥exe.win-amd64-3.5
mkdir images
move *.gif images
endlocal
exit /b
|
4) EXE化する
以上で準備は整ったので、"make_exe.bat" を実行して EXE化する。成功すると "build¥exe.win32-3.5" や"build¥exe.win-amd64-3.5" 配下に"QuickIR.exe" が出来ている。
ダブルクリックして正常に起動すれば作業は完了だ。
それにしても EXEファイル以外に随分と多くのファイルがあるものだ。DLLなどは、もう少し纏められないものだろうか?これについては、何か方法がないか、もう少し調べてみようと思う。
これまで作成してきた Windowsの EXEファイルにするための"cxFreeze_setup.py", "make_exe.bat" 等を取り込んだ QuickIR Ver.1.0.8へのリンクを以下に張っておく。但し、以下には EXE化された QuickIRは含まれてないので、EXE化するためには Python 3.5.2 と cx_Freeze 5.0 が必要なのでご注意。
(*1):2016.11.20追記
setupスクリプトの'include_files' にはファイルだけでなく、ディレクトリも指定可能であることが cx_Freeze のドキュメントに書かれてあり、こんな事は不要なのだという事が分かった。
List containing files to be copied to the target directory.
It is expected that this list will contain strings or 2-tuples for the source and destination.
The source can be a file or a directory.
The target must not be an absolute path.
'include_files' リストには、取り込みたいファイルだけでなく、コピー元(source)とコピー先(destination)をタプルにした物も要素に書くことができる。コピー元(source)にはファイルとディレクトリが指定できるとのことだ。そのため、setupスクリプトの'include_files' は以下のように書けば良く、
include_files = [python_dir + r'¥DLLs¥tcl86t.dll',
python_dir + r'¥DLLs¥tk86t.dll',
'images']
|
EXE化するバッチファイルも以下のような簡単なものなる。
@echo off
setlocal
python cxFreeze_setup.py build
endlocal
exit /b
|
|