【Python】cx_freezeを使ってスタンドアロンアプリ化する(Win,Mac両方解説)

2019-04-02 17:47:54 1737

ついにPythonコードを誰もが実行できるアプリ化に成功したので、メモ。
たぶん、これで指定されたアプリ以外のダウンロードが禁止されている社内に革命起こせる。(何故かPythonはインストール可能)

前提

Windows:Windows10 64bit
Python:Python 3.6.2

Mac:macOS 砂漠
Python:Python 3.6.2

https://www.web-cte.co.jp/kozakuralab/?p=1462

pipでcx_freezeをインストール

下記のコマンドを実行。

pip

pip install cx_freeze

setup.pyの作成(ここが一番重要)

既存のpyをexe化、app化するためのsetup.pyを作成する。
以下、

setup.py

# coding: utf-8

############### cx_Freeze 用セットアップファイル ##########
# コマンドライン上で python setup.py buildとすると、exe化 #
# Mac用のAppを作成するには、buildをbdist_macとする #
######################################################

import sys, os
from cx_Freeze import setup, Executable

#個人的な設定(コマンドライン上でファイルをぶっこみたい)
file_path = input("アプリ化したいpy:")

#TCL, TKライブラリのエラーが発生する場合に備え、以下を設定
#参考サイト:http://oregengo.hatenablog.com/entry/2016/12/23/205550
if sys.platform == "win32":
base = None # "Win32GUI" ←GUI有効
#Windowsの場合の記載 それぞれの環境によってフォルダの数値等は異なる
os.environ['TCL_LIBRARY'] = "C:\\Users\\[ユーザー名]\\AppData\\Local\\Programs\\Python\\Python36-32\\tcl\\tcl8.6"
os.environ['TK_LIBRARY'] = "C:\\Users\\[ユーザー名]\\AppData\\Local\\Programs\\Python\\Python36-32\\tcl\\tk8.6"
else:
base = None # "Win32GUI"

#importして使っているライブラリを記載
packages = []

#importして使っているライブラリを記載(こちらの方が軽くなるという噂)
includes = [
"sys",
"os",
"requests",
]

#excludesでは、パッケージ化しないライブラリやモジュールを指定する。
"""
numpy,pandas,lxmlは非常に重いので使わないなら、除く。(合計で80MBほど)
他にも、PIL(5MB)など。
"""
excludes = [
"numpy",
"pandas",
"lxml"
]

##### 細かい設定はここまで #####

#アプリ化したい pythonファイルの指定触る必要はない
exe = Executable(
script = file_path,
base = base
)

# セットアップ
setup(name = 'main',
options = {
"build_exe": {
"packages": packages,
"includes": includes,
"excludes": excludes,
}
},
version = '0.1',
description = 'converter',
executables = [exe])

excludesで、不必要なライブラリを指定しないと、すべてのライブラリがパッケージ化されてしまう。そのため、たった1行のプログラムでも100MBを超える可能性がある。
numpyやpandas、lxmlは重いので気をつけたい。

他の細かい留意点はサンプルの中のコメントを読んでほしい。

ビルド(setup.pyを使ってアプリ化)

setup.pyを書き終えたら、次はコマンドプロンプトで以下を実行

WindowsでEXEファイルを作成する場合

コマンドプロンプト

python setup.py build

sample.pyをアプリ化したいファイルとして指定して実行すると、buildというフォルダが作成される。

build
┗exe.win32-[pythonのバージョン]
 ┣lib
 ┣[pythonバージョン].dll
 ┗sample.exe

buildフォルダの中身

このsample.exeを実行すれば、python環境がないPCでもプログラムを作動させることができる。
ちなみに、libフォルダにはpythonのライブラリが詰まっている。ここが一番重たい。

exeの実行でエラーが派生する場合、大抵はライブラリがインポートできないというものが多い。
エラー内容をみて、includesに加え、もう一度ビルドアップするという地道な解決方法しか今の所ない。
また、includesにも指定できないものは、ライブラリの中のモジュールが指定されている場合が多い。
エラ内容をネットでググれば、指定すべきモジュールがわかる。
(idna.idnadataとか・・・)


MacでAppファイルを作成する場合

ターミナル

python setup.py bdist_mac

つづきは帰ったら書こうと思う。



@beryl_fe2
2019-03-31 19:21:34
Pythonのツールを実行ファイル(.exe)化するためにcx-freezeを触った。https://t.co/jhcdHHZV9Wをつくって、ビルドして、xxx.dllが足りないとかidnaモジュールが足りないとか色々言われなが… https://t.co/QelOW5KbR5

関連記事