解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

Python を exe ファイルに変換する



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思ってグラフの描き方、ファイル選択ダイアログの使い方を調べてきました。
ここで、気分転換に exe ファイルに変換してみたいと思います。

ファイル選択ダイアログでファイルを選択して、選択されたファイルのパスをメッセージボックスで表示する exe ファイルを作成します。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

以下の2つのソースコードは共に下記の【保存ディレクトリ】に保存しました。
ファイルもそれぞれ書いておきます。

【保存ディレクトリ】
C:\WinPython-64bit-3.4.4.6Qt5\settings\.spyder-py3

exe ファイルソースコード : GUI0.py
変換実行ソースコード : GUI_Ex0.0.py

下の『結果』で今回発生したエラーについても、まとめていますが、ファイル名でには要注意です。

exe ファイル ソースコード


###############################################################################
# メッセージボックスとファイル選択ダイアログの GUI プログラム
###############################################################################
# モジュールのインポート
import os, tkinter, tkinter.filedialog, tkinter.messagebox
import sys
 
#==============================================================================
# 設定
#==============================================================================
program_name = 'GUIプログラム' # プログラム名設定
 
flag_type = 0 # 読み込むファイルの形式設定
# 0 : すべてのファイル
# 1 : cvs ファイルのみ
# 2 : xls ファイルのみ
# 3 : xlsx ファイルのみ
# 4 : xls, xlsx ファイルのみ
# 5 : txt ファイルのみ
# 6 : mp3 ファイルのみ
 
flag_multi_select = 1 # ファイル選択可能数設定
# 0 : 単一ファイル選択
# 1 : 複数ファイル選択
 
#==============================================================================
# GUI プログラム
#==============================================================================
# Tk オブジェクトのインスタンス作成
root = tkinter.Tk()
 
# Tk のウィンドウを非表示にする
root.withdraw()
 
# 読み込むファイル形式の設定
if   flag_type == 0:
    fTyp = [("すべてのファイル", "*")]    # すべてのファイル
elif flag_type == 1:
    fTyp = [("csvファイル","*.csv")]    # cvs ファイルのみ
elif flag_type == 2:
    fTyp = [("Excelファイル","*.xls")]  # xls ファイルのみ
elif flag_type == 3:
    fTyp = [("Excelファイル","*.xlsx")] # xlsx ファイルのみ
elif flag_type == 4:
    fTyp = [("Excelファイル","*.xls"),
            ("Excelファイル","*.xlsx")] # xls, xlsx ファイルのみ
elif flag_type == 5:
    fTyp = [("テキストファイル","*.txt")]   # txt ファイルのみ
elif flag_type == 6:
    fTyp = [("音声ファイル","*.mp3")]   # mp3 ファイルのみ
 
# ファイル選択ダイアログのイニシャルディレクトリの設定
#initDir = os.path.abspath(os.path.dirname(__file__))
initDir = 'C:\\'
 
# メッセージボックスの表示
tkinter.messagebox.showinfo(program_name, '処理ファイルを選択してください.')
 
# ファイル選択ダイアログの表示
if flag_multi_select == 0:
    file = tkinter.filedialog.askopenfilename(filetypes = fTyp, initialdir = initDir)
    if file == "":
        tkinter.messagebox.showinfo(program_name, '処理を中断します.')
        sys.exit()
    # 処理ファイル名の出力
    tkinter.messagebox.showinfo(program_name, file)
    print(file)
else:
    files = tkinter.filedialog.askopenfilenames(filetypes = fTyp, initialdir = initDir)
    if files == "":
        tkinter.messagebox.showinfo(program_name, '処理を中断します.')
        sys.exit()
    l = list(files)
    # 処理ファイル名の出力
    tkinter.messagebox.showinfo(program_name, l)
    print(l)
 
#==============================================================================
# ファイル処理プログラム
#==============================================================================
 
 
print('\ncomplete!!')



変換実行ソースコード


import sys
from cx_Freeze import setup, Executable
 
base = None
 
if sys.platform == 'win32':
    base = 'Win32GUI'
 
exe = Executable(script='GUI0.py', base=base)
 
setup(name='GUI',
      version='0.1',
      description='converter',
      executables=[exe])



コマンドプロンプト

図1 コマンドプロンプト



結果

上の exe ファイルソースコードを最初は『 GUI0.0.py 』として保存していました。 exe ファイルは生成できたのですが、 exe ファイル実行時に図2 のエラーメッセージが表示されました。

図2 エラーメッセージ


なんのことかよくわかりませんが、『 GUI0.0.py 』というファイルが悪さをしている感じがしたので、exe ファイルソースコードを『 GUI0.py 』というファイル名で保存し直して、再度 exe ファイルに変換しました。

すると、 exe ファイルは生成できたのですが、 exe ファイル実行時に図3 のエラーメッセージが表示されました。

図3 エラーメッセージ


ファイル選択ダイアログで、最初に表示するディレクトリ設定をスクリプトファイルがあるディレクトリとしていたのですが、 exe ファイルに変換すると取得できなくなるみたいなので、 C ドライブ直下を指定する様にソースコードを変更して再度 exe ファイルに変換しました。
すると、正常に動作する様になりました。


exe ファイルは上の2つのソースコードを保存したディレクトリ『 C:\WinPython-64bit-3.4.4.6Qt5\settings\.spyder-py3 』に新しく『 build 』というフォルダができます。その中に exe ファイルと付帯ファイルが出来ています。

起動スピード、実行速度共に普通なスピードでした。

まぁ、簡単なファイル選択のみのプログラムなので当たり前ですが…



コメント

exe ファイルに変換出来ると自動化や効率化に大きく影響してくると思います。

今のプログラムのままでは使い道がないので、もうちょっと実用的なクラス、関数を作って組み込みたいです。



以上