2013年10月9日水曜日

PyInstallerで簡単exeファイルの作成

py2exeからPyInstallerに乗り換えるとすこぶる簡単だったというはなし。

PyQtで作ったGUIアプリを職場のみんなに使ってもらうにはexeファイルを作成しなければならない状況にあって、以前はpy2exeでmatplotlibやPyQt4のアプリをexeファイル化していたが、py2exeを実行すると
The following modules appear to be missing
と言うエラーメッセージが 出てうまくいかない。どうもオプションでbundle=1と設定するとうまくいかないようだ。(bundle=1はDLLなどを1つexeに詰め込む設定。bundle=3だとうまく動いた。)
しかも何が足りないって、IronPythonとか使った記憶がないモジュールばかりなので、ちょっとわけがわからなくなった。

StackOverflowなんかを見てみるとpy2exeは止めてPyInstallerを使えって回答が多かった。
なんとなくPyInstallerはインストーラーを作るイメージがあって使ってなかったけど、exeファイルもつくれるようだ。食わず嫌いでした。


ほんで、実際にPyInstallerを使ってみたらすこぶる簡単だった。今までの時間は何だったのか。
インストールの仕方など調べてみると少し古いのもあって混乱したので、ここに簡単な使い方を紹介しておく。


1. インストール

PyInstallerのドキュメントにインストール方法が書いてある。Installing Using pipに従うと、
>pip install pyinstaller
とするだけ。
その下にPyWin32が必要とか書いてあるけど、今回は特に何もしなかった。多分Python(x,y)をインストールしたときに色々一緒にいれたので、そのときに入っていたのかもしれない。


2. exeファイル化

Pythonのスクリプトファイルがある場所に移動して、
>pyinstaller hoge.py

とするだけ。自動で必要なファイルやらなんやらを取得してくれるらしい。
buildとdistというフォルダが生成されてdistの中にあるexeファイルを実行ればpythonで作成したアプリが動作する。

今回はexeにすべて詰め込みたかった+実行時コマンドプロンプトを表示させたくなかったので
>pyinstaller hoge.py --onefile --noconsole 
というオプションを加えた。オプションについてはここを参照。

今回はPyQt4を使ったものをexe化したけど、matplotlibやOpenGLでもこんなに簡単やったらいいなぁ。

4 件のコメント:

  1. このコメントは投稿者によって削除されました。

    返信削除
  2. 教えてください。
    c:\Users\mtg-1>pyinstaller hello.pyとすると
    NameError: name 'Makespec' is not defined
    'Makespec'が定義されていないとなります。もちろんパスは通っています
    原因は何なのでしょうか?

    返信削除
    返信
    1. そのようなエラーを見たことないのでわかりません。
      .specファイルを作成してみてはいかがでしょうか?
      https://pythonhosted.org/PyInstaller/spec-files.html

      たしかpyinstaller hoge.specでできるはずです。

      削除
    2. ありがとうございます。再度インストールし直しましたらできました。インストール時に不具合があったと思われます。

      削除