PyInstallerでPythonスクリプトをexe化


このエントリーをはてなブックマークに追加

PythonスクリプトをWindowsのexeにする方法 (調査中) - minus9d's diary にて、Python 3.5のスクリプトWindowsのexe化するにはPyInstallerが良さそうだという記事を書きました。この記事ではPyInstallerを使ってexe化する方法について調査した結果を記します。

スクリプトの用意

数式を微分するスクリプト differentiator.pyを用意します。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from sympy import symbols, diff
from sympy.parsing.sympy_parser import parse_expr

while True:
    x = symbols('x')
    math_expr = input('please input f(x): ')
    print("f'(x) =", diff(parse_expr(math_expr), x))

このスクリプトをコンソールで実行すると

please input f(x):

と聞かれるので、

a * x * sin(x)

などと入力してください。f(x)をxで微分した結果が以下のように得られるはずです。

f'(x) = a*x*cos(x) + a*sin(x)

Ctrl + Cで終了です。このスクリプトをexe化することを目標とします。

環境の用意

Windows 10 + Anaconda Python 64bit 4.1.6 + Python 3.5.1にて

> pip install pyinstaller

としてpyinstallerをインストールしました。現時点で3.2がインストールされました。

exeは生成できるが実行できない

exeを生成するには、コマンドプロンプトにて

> pyinstaller --onefile differentiator.py

とすればOKなはずです。実行すると、大量のWARNINGとErrorが出るものの、dist以下にdifferentiator.exeが生成されました。

しかし、生成されたexeをダブルクリックすると

---------------------------
differentiator.exe - 正しくないイメージ
---------------------------
C:\(省略)\VCRUNTIME140.dll は Windows 上では実行できないか、エラーを含んでいます。元のインストール メディアを使用して再インストールするか、システム管理者またはソフトウェアの製造元に問い合わせてください。エラー状態 0xc000007b。 
---------------------------
OK   
---------------------------

というエラーダイアログが出て、実行に失敗しました。

setuptoolsをダウングレードしてexeの実行に成功

'six' is required; worked fine with previous version of pyinstaller · Issue #1773 · pyinstaller/pyinstaller · GitHubに、setuptoolsのバージョンを19.2に下げると解決したという報告があります。私の環境でも、setuptoolsのバージョンを23.0.0から19.2に下げると、確かにexeが実行できるようになりました。ただし、exeの生成時に大量のWARNINGとErrorが出るのは相変わらずなので、まだ問題が潜んでいる可能性はあります。

以下は、Anacondaで仮想環境を作って試したときのコマンドです。仮想環境の詳細については"conda create"でググってください。

> conda create -n pyinstaller_test python setuptools=19.2 sympy pywin32
> activate pyinstaller_test
> pip install pyinstaller