2016年11月13日
NSISでpy2exeとcx_fleezeを1ファイルexe化
前回の記事
>python3でpy2exe
>https://fanblogs.jp/mountain4101/archive/58/0
では、pythonで書いたプログラムを
「pyinstaller」、「py2exe」、「cx_fleeze」
の3種類でexe化した。
その際、pyinstallerは1ファイルでexe化されたが、
py2exeは1ファイルや2ファイルで指定しても
必ず3ファイルで出力された。
cx_fleezeは5ファイルで出力される。
他の人も気軽に使えるようにしたいことを考えると、
1ファイルがいい。
「〇〇のフォルダに放り込んでダブルクリックしてくれればいいから」
と指示も簡単だ。
そこで前回記事の最後に書いた、
NSISというソフトでの1ファイルexe化を試みる。
調べるとNSISは
自作プログラムのインストーラを作るソフトのようである。
ただし、指定によっては
一時フォルダに展開して実行まで自動でするようにできるので
実質1ファイルのexeにまとめているようなものとのこと。
(下記のサイトの652に書かれている。)
>くだすれPython(超初心者用) その24
>http://peace.2ch.net/test/read.cgi/tech/1407008551/
さらに調べると
NSISにはポータブル版があるとのこと。
自分はwinpythonを使っているので
NSISもポータブル版があるとありがたい。
早速下記のサイトからダウンロードする。
>PortableApps.com NSIS Portable
>http://portableapps.com/apps/development/nsis_portable
Unicode版、ANSI版があるが
よくわからずUnicode版をダウンロード。
フォルダの移動がめんどくならないよう
winpythonのフォルダの直下にインストールした。
(C:\WinPython-64bit-3.4.3.6)
さあ1ファイルのexeを作ろう。
環境
・PC:surface pro (初代)
・OS:windows10(64bit)
・winpython3.4 (64bit)
・py2exe 0.9.2.2
(cx_fleeze 4.3.4)
・NSIS Portable Unicode 2.46.5 Rev 3
使い方を調べると
下記のサイトがあった。
参考サイト@
>NSISというのを使って、py2exeで作ったファイルを一つに見まとめてみた
>http://blogs.yahoo.co.jp/topitopi38/1038112.html
リンク先の下記のサイトも記載しておく。
参考サイトA(オール英語です。)
>SingleFileExecutable
>http://www.py2exe.org/index.cgi/SingleFileExecutable
参考サイトAにはsetup.nsiというプログラムが
2種類記載されている。
そのうち2つ目の方のコードをコピーする。
参考サイト@にも記載されているが、
最初の3行を自分の内容に書き換える。
(ファイル名はpy2exeのsetupファイルと紛らわしいので
setup_nsis.nsiとした。)
1行目
!define py2exeOutputDir 'dist'
はpy2exeがexeを含む3ファイルを吐き出すフォルダ名である。
(このフォルダ内のファイルを1つにまとめることになる。)
2行目
!define exe 'test.exe'
setupファイルの隣にこの名前のexeファイル(1ファイル)が吐き出される。
3行目
!define icon 'C:\WinPython-64bit-3.4.3.6\python-3.4.3.amd64\DLLs\py.ico'
iconファイルのパスを示す。
ちなみにnsisで扱うパスは日本語が入っているとエラーになるようなので注意。
ここではpythonのファイルのicon。
参考サイトには書いてないが
4行目
;!define compressor 'lzma' ;one of 'zlib', 'bzip2', 'lzma'
これは「;」マークでコメントアウトする。
圧縮すると容量は半分くらいになるが、
完成したexeファイルを実行したときに
若干起動が遅くなる。
(解凍時間が含まれるためだろう。)
次にNSISの実行ファイル(makensis.exe)へのパスを通す。
環境変数のpathに
C:\WinPython-64bit-3.4.3.6\NSISPortable\App\NSIS
を登録した。
そしてコマンドプロンプトで
cdコマンドでsetupファイルのある場所に移動し、
「makensis.exe setup.nsi」
と打つ。
自分はめんどくさいのでbatファイルに書いてしまう。
とうとう1ファイルのexeが
吐き出された。
さっそくexeファイルをダブルクリックすると、
いつものtextファイルが吐き出され、成功である。
ただ、、、、アイコンが
指定したpythonの.pyのアイコンじゃない。。。
ダサい。
PCとCDの絵がついた旧式のインストーラのアイコンである。
ちなみにそのexeファイルを隣にコピペすると
コピーの方はpythonのアイコンに変わる。
何でだ?
と思って調べてみる。
参考サイトB
>アイコンが変わらない?
>http://blog.syo-ko.com/?eid=1451
とそのリンク先のサイト
参考サイトC(参考サイトBのwindows8の場合のリンク)
>PC、ゲーム、ガジェットの紹介、PCトラブルシューティングの記録とか色々。
>Windows 8 で 変更したはずのアイコンが変わらない
>http://eisen-japan.blogspot.jp/2013/08/windows-8.html
を見ると、
IconCacheというキャッシュファイルが
残っているせいらしい。
参考サイトCに書いてあるとおり
下記の画像のbatファイルを作成してみる。
(IconCacheファイルの種類は各パソコンの環境によって
異なると思うので、フォルダ内を確認してから作ってください)
そして実行。
これでキャッシュファイルは消えた。
もう一度exeファイルを作り直してみる。
よし、pythonのアイコンになったぞ。
これで完成だ。
では次に
cx_fleezeで同様のことをやってみよう。
下記の画像がsetup.nsiファイル(自分はファイル名をsetup_nsis.nsiとしている。)
1行目
!define cx_fleezeOutputDir 'build\exe.win-amd64-3.4'
今度はpy2exeではないので
「cx_fleezeOutputDir」に変える。
cx_fleezeがexeファイルを含む5つのファイルを出力するフォルダを指定するので
「build\exe.win-amd64-3.4」となる。(自分のcx_fleezeの仕様による。)
42行目
File /r '${cx_fleezeOutputDir}\*.*'
こちらもpy2exeOutputDirからcx_fleezeOutputDirに変える。
そして
batファイルで「makensis.exe setup_nsis.nsi」
を実行。
cx_fleezeでも1ファイルのexeファイル
を出力できた。
「pyinstaller」、「py2exe」、「cx_fleeze」
の3種類ですべて1ファイルのexe化ができるようになった。
個人的には
cx_fleezeはexeファイルをダブルクリックすると
一瞬だけコマンドプロンプトが立ち上がるのが
いやである。
まあ、一瞬だけなので、
他の性能が良ければ使ってもいいが。
1ファイルにした場合の各exeファイルの容量は五十歩百歩である。
・pyinstaller 4.97MB
・py2exe 5.53MB
・cx_fleeze 6.11MB
ほんとは速さを測定してみたいが
自分にはそのスキルはない。
まあ、今のところはそんなに差を感じない。
プログラムが複雑になったときに明確に差が出てくるだろう。
よし、今度こそ
役に立つexeファイルをたくさん作るぞ。
この記事へのトラックバックURL
https://fanblogs.jp/tb/5614388
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック
ありがとうございます