スクリプトを exe化する方法 【Python & Windows】

Python

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()
タイトルとURLをコピーしました