Python2.7のプログラムをexe化する

次に、Python2.7で作ったプログラムを配布用にexe化してみます。
まず、仮想環境を作ります。

次に、py2exeをインストールします。試しにpipでやってみると、

ということで、pipでインストールできるpy2exeはpython3.3以降が必要、ということでエラーになります。ですので、sourceforgeから2.7用のインストーラをダウンロードしてきて実行します。インストーラはexe形式のGUIになっていて、デフォルトでは大元のsite-packagesの下にインストールされるようです。

exeに変換するにはセットアップスクリプトが必要なようですので、まずは以下の内容で作成しました。

今回は、メインのスクリプト(処理が始まるところ)は main.py なので、main.py を指定。bundle_filesに1を指定すると、生成したexeファイルにランタイムdllを含めてくれるので、配布が楽になります。(代わりにサイズが大きくなります)

自作のログ解析ツールをLOGというサブディレクトリにソースコードを一式置いてexe化してみました。

それほど時間がかからずに処理が終わり、buildとdistというサブディレクトリができて、distの下にmain.exe という実行ファイルが作成されていました。今回の場合はサイズは6MBほど、できた実行ファイルを実行してみると、特に問題なく動作しました。

ということで、意外にあっさりexe化に成功しました。

Windows10にPython環境を構築

訳あって、Windows10(たまたま32bit版)上でPythonの環境を構築しています。
で、Python2.7系とPython3系を同時に使いたいのと、Pythonの仮想環境を利用したい(作ったスクリプトを他人に使わせるには必要なパッケージが明確になってないといけない)ので、いろいろ調べながらやってます。

1.Pythonのインストール

まず、Python3系をインストーラを使ってインストールします。インストール時には「Add Python to environment variables」のチェックは外しておきます。py.exeに起動するPythonを選ばせるためみたいです。

次に、Python2系をやはりインストーラを使ってインストールします。インストール時には「Register Extensions」を外します。

インストールできたかどうかは

としてそれぞれPython2系、Python3系が起動できているか確認します。

2.virtualenvのインストール

Python2系用の仮想環境を作成するvirtualenvをインストールします。

デフォルトの文字コードがasciiだと失敗するようなので、デフォルトの文字コードを変更します。C:\Python27\Lib\site-packages の下に、sitecustomize.py という名前で以下のファイルを作成します。

作成したら、反映されていることを確認します。

次に、pipをバージョンアップします。

次に、virtualenvをインストールします

3.virtualenvを使ってみる

早速Python2.7の仮想環境を作ってみます。

ということで、エラーになってしまいます。で、エラーの原因はまた「UnicodeDecodeError」です。
原因は、どっかにあるvirtualenv.pyの中で文字コードがascii決め打ちになっているsite.pyを仮想環境の中に展開して、それを使ってしまうために起きているように見えます。
いろいろやってみると、virtualenvを再実行しても一旦ディレクトリを消したりはしないようですので、これを逆手にとって、一度実行してエラーになってから、sitecustomize.py をコピーしてやるととりあえず最後まで処理が進むようです。
具体的には、上記の例の場合、エラーになってから、sitecustomize.py をコピーしてきてから再度 virtualenv を起動します。(注:そんなことをしなくてもいい方法がありました・・・後のほうに書いてあります

ということで、旨くいきました。仮想環境への移行も

でうまくいくようです。
この上で、scriptsフォルダの下にあるactivate.batを動かして仮想環境に移行後、python2用に作成したスクリプトを動かしてみましたが、無事に動作しました。

直後に追記)
こんな回りくどいことをしなくても、–system-site-packages と付ければOKのようです。
(下記1行目がその例です)

4.venvを使ってみる

Python3系用の仮想環境のvenvを使ってみます。こちらはpython3系には標準で入っているので簡単です。使い方はvirtualenvとほぼ同じ。

でPython3系が動くことが確認できました。