cx_freeze(Python3.6.1対応)の初期設定とかトラブルシューティングした話

f:id:sakage24:20170603164635j:plain

Python楽しいですよね。直感的に書けるので大好きです。ただ、Windowsで扱うにはやや難点があるのも事実。今日は私が行ったインストール手順とか初期設定、トラブルシューティングをお話しします。

  1. Pythonのインストール
  2. 実行に必要なライブラリのインストール

上記の手順を踏まなければ起動すらしないという悲しみがあります。そんなソフトウェア公開しても、誰が使うねんって感じですよね。

そんな時にはPythonのexe化ツールcx_freezeがおすすめです。エラー落ちしても泣かない。

インストール

公式サイトはこちらをご覧ください。コマンドプロンプト上で

python -m pip install cx_Freeze --upgrade

これで最新版がインストールされるはずです。まれにexe化が出来ても、よく分からないエラーが出て起動できなくなることがあります。

これはcx_freezeのバグによるものなので、fixされたバージョンを使うとよいです。

Python Extension Packages for Windows – Christoph Gohlke

こちらから、修正されたバイナリファイルをダウンロードできます。

pip install cx_Freeze‑5.0.2‑cp36‑cp36m‑win32.whl

これでインストールできます。

余談ですが、特に理由がない場合、pythonは32bitを使いましょう。64bit版は32bit版pythonだと起動すらしなかったりするので、ストレスがマッハになりますw

setup.pyの作成

setup.py

from cx_Freeze import setup, Executable
# baseはおまじない
base = None
# ライブラリは基本的にcx_freezeが自動で組み込んでくれるが、たまに見落とすので手動で入れておいたほうが精神衛生上良い。
# エラー落ちの原因No1候補
includes = ['lxml', 'lxml._elementpath', "httplib2", "chardet", "logging", "traceback"]
# 除外するライブラリ
excludes = []
# よくわからない
packages = []
# include_filesでスクリプトファイルを指定しておかないと全部python36.zipに纏められる。
# つまり、ファイルのパスが変わる。プログラム中、os.path.dirname(__file__)とかでパスを取得している場合は特に注意。
# エラー原因率高し。
include_files = ['config.yaml', "README.md", "clean_up.py", "scraper.py", "target.py", "utility.py"]
# コピペで平気。run.pyはちゃんと自分の環境に書き換えること。
setup(name="vip_scraper",
version="1.0.3",
description="Python3で2chをスクレイピングするお",
options={"build_exe": {"includes": includes, "excludes": excludes, "include_files": include_files}},
executables=[Executable("run.py", base=base)])

注意点をまとめておきました。正直、ここが一番エラー起こします。プログラムにエラーがなさそうなのにクリックしても起動しない場合は間違いなくsetup.pyに原因があります。

なお、loggingでログとるなり、try-except仕込むなりプログラム中にinput()を置くなりすると原因究明が楽です。

メインのスクリプトをクラスに移して、起動するだけのrun.pyみたいなファイルを作ると楽です。

run.py

import traceback
from scraper import Scraper
from colorama import init
from logging import getLogger, StreamHandler, FileHandler, DEBUG, INFO
import logging
class Run(object):
init()
# ログ関連。詳細↓が参考になった。
# http://qiita.com/amedama/items/b856b2f30c2f38665701
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = getLogger(__name__)
s_handler = StreamHandler()
f_handler = FileHandler('app.log', mode='at', encoding='utf-8')
s_handler.setLevel(DEBUG)
f_handler.setFormatter(formatter)
f_handler.setLevel(INFO)
logger.setLevel(INFO)
logger.addHandler(s_handler)
logger.addHandler(f_handler)
try:
# 想定されない全てのエラーをここで受け取る
Scraper(logger)
except:
logger.error(traceback.print_exc())
logger.info("予期しないエラーが発生しました...app.log見せてくれると対応できるかもしれません...")
logger.info("報告は https://www.kiwi-bird.xyz までどうぞ")
input("プログラムを終了します。Enterを押してください...")

exeの作成

実行ファイルの作成を行います。コマンドプロンプト上でプログラムのあるフォルダに移動します。

> cd C:\Users\貴方のユーザー名\PycharmProjects\vip_scraper
> py setup.py build

多分なんかエラーとか出まくりますが、無視します。ディレクトリ上にbuildというフォルダが生成されたら成功です。

終わり

もっと楽に起動出来たらいいんですけどね~。Windowsではデフォルトで入ってないのが一番でかいような…

入門 Python 3

入門 Python 3

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

  • 作者: Al Sweigart,相川愛三
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2017/06/03
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

コメントを残す

メールアドレスが公開されることはありません。