企画・概要
- python3がない環境のPCでpython3のプログラムを動かしたい
- ソフト使えばええやんとか禁句(書いてみることに意味があるキリッ)
- pyinstallerを使えばexe化ができるらしい
環境
- windows10
- Python 3.5.2 |Anaconda 4.2.0 (64-bit)
- PyInstaller: 3.2.1
実行
それでは早速やってみよう。
コマンドプロンプトで以下を入力してインストール。
pip install pyinstaller
exe化するプログラム
今回書いたものは画像をリサイズするプログラムだ。
フリーソフトを使えば一瞬でできることをわざわざ書いているので真似する必要はない。
お好きなプログラムでどうぞ。
#! python3
# -*- coding: utf-8 -*-
from PIL import Image
import sys
print("画像のリサイズを行います")
try:
inp_img = str(input("ファイル名を入力:"))
filename = "picture/" + inp_img + ".jpg"
img = Image.open(filename, "r")
except FileNotFoundError:
print("【エラー】ファイルが見つかりません!\n"
"ファイルはpictureフォルダの中に入れてください")
exit()
try:
inp_a = int(input("縦:"))
inp_b = int(input("横:"))
except ValueError:
print("【エラー】半角数字を入力してください")
exit()
resize_img = img.resize((inp_a, inp_b))
# 2017/07/21
# .jpgを削除しないと'pic01.jpg_resize2.jpg'のようになる
filename = filename.replace(".jpg", "")
filename = filename + "_resize2.jpg"
resize_img.save(filename, "JPEG", quality=100, optimize=True)
print("【結果】: " + filename)
thumbnailを使うと綺麗にリサイズできると読んだので試してみたが、指定通りの大きさにリサイズされなかったため断念(コードはおまけ参照)。resize()であれば指定通りのサイズになる。
FileNotFoundErrorはファイルが見つからなかったときのエラー。
ValueErrorは数字以外を入力したときのエラー対策。
qualityの数字を上げることで品質を上げることができる。
画像のリサイズを行います
ファイル名を入力:pic01
縦:100
横:200
【結果】: picture/pic02_resize2.jpg
※pillowが入ってなければ以下のコマンドを実行。
pip install pillow
pyinstallerを使おう
コマンドプロンプトで以下を入力。
pyinstaller.exe resize.py --onefile --clean
(※1)resize.pyの部分にはexe化したいプログラム名を書くこと。
(※2)当然だが指定のプログラムが配置されている階層で行うこと。
/distができたと思うのでその中にあるexeをダブルクリック。
resize.pyでは/dist/pictureが必要なので予め作成して画像を突っ込んでおく必要がある。自動でフォルダを作るとかそんな処理を書いた覚えはない。
ちなみにこのままではエラーが出たときに一瞬で画面が消えてしまってコメントが読めない。そこでもう少し書き換えることにする。
def end():
while True:
key = str(input("'e'を入力すると終了します:"))
try:
if key == "e":
sys.exit()
except ValueError:
break
前のプログラムのexit()をend()に書き換えればeキーが入力されるまで終了しないようになる。
反省
exe化するプログラムはコマンドプロンプトに依存する形のものではなく、PyQtなどを使ったGUIの方が良いと思った。
おまけ
thumbnailを使ったリサイズプログラム。
適当な大きさにリサイズしたい場合はthumbnailを、指定通りにリサイズしたい場合はresizeを使うのが良いだろう。
from PIL import Image
print("リサイズを行います. jpgのみ対応.")
inp_img = str(input("ファイル名のみ入力してください:"))
filename = "picture/" + inp_img + ".jpg"
img = Image.open(filename, 'r')
a = int(input("縦:"))
b = int(input("横:"))
img.thumbnail((a, b), Image.ANTIALIAS)
img.save(filename+"_resize.jpg", "JPEG", quality=100, optimize=True)