広告

posted by fanblog

2016年11月13日

NSISでpy2exeとcx_fleezeを1ファイルexe化


前回の記事
>python3でpy2exe
http://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とした。)

nsis01.jpg

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ファイルに書いてしまう。

nsis02.jpg

とうとう1ファイルのexeが
吐き出された。
さっそくexeファイルをダブルクリックすると、
いつものtextファイルが吐き出され、成功である。

ただ、、、、アイコンが
指定したpythonの.pyのアイコンじゃない。。。
ダサい。

PCとCDの絵がついた旧式のインストーラのアイコンである。

nsis03.jpg

ちなみにその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ファイルの種類は各パソコンの環境によって
異なると思うので、フォルダ内を確認してから作ってください)

nsis04.jpg

そして実行。

これでキャッシュファイルは消えた。
もう一度exeファイルを作り直してみる。

よし、pythonのアイコンになったぞ。
これで完成だ。

nsis05.jpg


では次に
cx_fleezeで同様のことをやってみよう。
下記の画像がsetup.nsiファイル(自分はファイル名をsetup_nsis.nsiとしている。)

nsis06.jpg

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」
を実行。

nsis07.jpg

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ファイルをたくさん作るぞ。



posted by iyoder at 01:22 | Comment(1) | TrackBack(0) | プログラム
この記事へのコメント
参考になります!
ありがとうございます
Posted by Python 初級者 at 2017年01月29日 16:49
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
http://fanblogs.jp/tb/5614388
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
最新記事
<< 2018年12月 >>
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
カテゴリーアーカイブ
ファン
プロフィール
最新コメント
×

この広告は30日以上新しい記事の更新がないブログに表示されております。