Python のスクリプトをコンパイルして実行ファイル化 (exe化) にする方法についてまとめておきます。以下の環境で動作確認しています。
環境: Windows パソコン、Anaconda、Python 3.x
pyinstaller のインストール
exe化するにあたり、pyinstaller をインストールする必要があります。
Windows のコマンドプロンプト(あるいは、Anaconda Prompt)を起動して以下を実行し、pyinstaller をインストールしてください。
pip install pyinstaller
Python スクリプトの準備
任意の Python のスクリプトを準備してください。なければ、末尾のサンプルプログラムを test1.py 等のテキストファイルに保存して、確認用に使ってみてください。
実行ファイル(*.exe)を生成する方法
コマンドプロンプトで、以下のコマンドを実行してください。(パス)とした部分は、スクリプト(test1.py)のあるパスを記載してください。あるいは、コマンドプロンプト上に exe化したいスクリプト(test1.py)をドラッグ&ドロップして、下記の記載となるように修正して、実行してください。
pyinstaller C:(パス)\test1.py --onefile --noconsole
・ 末尾の –onefile は1つの実行ファイルにする場合に必要です。
・ –noconsole はアプリの実行時にコンソールを非表示にする場合に必要です。もし不要であれば省いてください。
上記のコマンドを実行すると、コマンドプロンプトのカレントフォルダに dist というフォルダが生成されます。このフォルダの中に実行ファイル(*.exe)が生成されます。同exeファイルをダブルクリックして、exeファイルが動いたら、exe化と動作確認が完了です!
まとめ
Python のスクリプトを実行ファイル化(exe化)する方法についてまとめました。
Python で便利なツールができたら、tkinter などで GUI 化して実行ファイルにしてしまったほうが楽ですね。
なお、Python のスクリプトを簡単に実行する方法としては、バッチファイルを使う方法もあります。興味のある方は、下記の関連リンクも参考にしてみてください。
関連リンク
・ バッチファイルで Anaconda から Python を実行する方法 【Windows】
補足1:注意点
なお、2020年12 月の時点では、os, sys, glob, datetime, time, math, random, operator, selenium, ctypes, Image, pyperclip 等については、import してもビルドが通っています。(例: import os として os の関数を使っても *.exe ファイルが動作します。)
しかしながら、OpenCV や PyAutoGUI をインポートしたスクリプト(import cv2, import pyautogui と記載)をビルドしようとすると、下記のエラーが出てビルド自体がうまくできません。
呼び出しているモジュールが本当に存在しているか確認せよというエラーが出ています。import 部分のみ残し、自作部分のスクリプトを削除しても、ビルド自体ができません。pyinstaller と OpenCV 等のスクリプト間に矛盾があるようです。
PyInstaller.exceptions.ImportErrorWhenRunningHook:
Failed to import module __PyInstaller_hooks_0_pytest required by hook for module
c:\users\xxxxx\anaconda3\lib\site-packages\_pyinstaller_hooks_contrib\hooks\stdhooks\hook-pytest.py.
Please check whether module __PyInstaller_hooks_0_pytest actually exists
and whether the hook is compatible with your version of
c:\users\xxxx\anaconda3\lib\site-packages\_pyinstaller_hooks_contrib\
hooks\stdhooks\hook-pytest.py:
You might want to read more about hooks in the manual
and provide a pull-request to improve PyInstaller.
補足2:サンプルコード
import tkinter
def init1():
textbox1.delete(0, tkinter.END)
textbox1.insert(0, 0)
def button_click1():
num1 = int( textbox1.get() ) + 1
textbox1.delete(0, tkinter.END)
textbox1.insert(0, num1)
frame1 = tkinter.Tk()
frame1.title(u"*.exe test v0.1")
frame1.geometry("300x50")
textbox1 = tkinter.Entry(master=frame1)
textbox1.place(x=10, y=10, width=100)
button1 = tkinter.Button(frame1, text='+1', command=button_click1)
button1.place(x=130, y=10, width=100)
init1()
frame1.mainloop()