2016/11/29(火) [n年前の日記]
#1 [python] Pythonスクリプトをexe化
Windows + Pythonの環境で、Pythonスクリプト(PySideを使ったスクリプト)をexe化したいなと。
exe化する方法はいくつかあるようで。
_Packaging PySide applications on Windows - Qt Wiki
一番簡単なのは Pyinstaller らしいけど、exe化したソレの起動が遅いという話を見かけて。なので今回は、設定ファイルを書かないといけない代わりに起動が比較的速いと評されてる py2exe を試してみたり。
ただ、この py2exe、Python 2.7 までしか対応してないらしい。自分の手元の環境では Python 2.7 を使ってるからいいけれど、もし Python 3.x を使ってる場合は別の選択肢を選ぶことになるのだろうなと。
exe化する方法はいくつかあるようで。
- cx_Freeze を使う。
- py2exe を使う。
- Pyinstaller を使う。
_Packaging PySide applications on Windows - Qt Wiki
一番簡単なのは Pyinstaller らしいけど、exe化したソレの起動が遅いという話を見かけて。なので今回は、設定ファイルを書かないといけない代わりに起動が比較的速いと評されてる py2exe を試してみたり。
ただ、この py2exe、Python 2.7 までしか対応してないらしい。自分の手元の環境では Python 2.7 を使ってるからいいけれど、もし Python 3.x を使ってる場合は別の選択肢を選ぶことになるのだろうなと。
◎ py2exeのインストール。 :
_py2exe
は、
_py2exe - Browse /py2exe/0.6.9 at SourceForge.net
からダウンロード。py2exe-0.6.9.win32-py2.7.exe を入手。
実行すると、Python 2.7インストールフォルダ\Lib\site-packages\py2exe\ のあたりにインストール、してくれたのかな。たぶん。
実行すると、Python 2.7インストールフォルダ\Lib\site-packages\py2exe\ のあたりにインストール、してくれたのかな。たぶん。
◎ 設定ファイル setup.cy を書く。 :
以下のページを参考にして記述。
_py2exeモジュールについて ・ PythonMatrixJp
_exe変換(py2exe) - Python入門から応用までの学習サイト
_py2exeでPythonのスクリプトを実行ファイル(exe)にする【py2exe】 - ぴよぴよ.py
_[Python] pyInstallerの遅さにがっかりしてpy2exeにしたら爆速で驚いた件 ・ Nobwak's Lair
_py2exe のハマりどころメモ - プログラマのネタ帳
_Pythonでプログラムを作るときのTips - つかさのほえほえ日記
_PyQt でクロスプラットフォームなデスクトップアプリケーションを | Kosei Kitahara's Blog
_PyQt を py2exe でフリージング | Kosei Kitahara's Blog
今回は PySide を使ってるので、以下のように書いてみた。
IMAGELIB_DIR のあたりは自分の環境に合わせて書き換える必要有。もしかすると setup.cfg なるものを書いてこのへん設定すべき、なのかもしれないけれどサンプルが見つからなくて…。
PySide の標準状態では扱える画像フォーマットがそれほど多くないので、plugins を使って svgその他に対応してるらしいのだけど。py2exe はそのあたりイイ感じにしてくれない。よって、必要になりそうな dll を imgfiles のあたりで全部列挙して data_files で渡してやって「コレもコピーしといてくれよな」と py2exe に指示してる、のだと思う。
py2exe に渡すオプションとしては compressed、optimize、bundle_files 等があるようだけど。"bundle_files" : 3 にすると、1つの exeファイルにアレもコレも入れるのではなく、各ファイルをバラバラにしておいてくれるらしいので、そのように。というのも、PySide ってライセンスがLGPLだったから、それぞれ個別のファイルになってないとマズいのかなと思ったわけで。それと、3 を指定しないとそもそもウチでは動かない、という話もチラホラ見かけたし。
setup() の個所で、console = [ ] と書けばコンソールアプリとして、windows=[ ] と書けばGUIアプリとして扱ってくれるらしい。
zipfile=None という記述もあちこで見かけたけど、手元の環境でソレをしたらエラーが出てしまった。仕方ないのでファイル名を指定。
_py2exeモジュールについて ・ PythonMatrixJp
_exe変換(py2exe) - Python入門から応用までの学習サイト
_py2exeでPythonのスクリプトを実行ファイル(exe)にする【py2exe】 - ぴよぴよ.py
_[Python] pyInstallerの遅さにがっかりしてpy2exeにしたら爆速で驚いた件 ・ Nobwak's Lair
_py2exe のハマりどころメモ - プログラマのネタ帳
_Pythonでプログラムを作るときのTips - つかさのほえほえ日記
_PyQt でクロスプラットフォームなデスクトップアプリケーションを | Kosei Kitahara's Blog
_PyQt を py2exe でフリージング | Kosei Kitahara's Blog
今回は PySide を使ってるので、以下のように書いてみた。
# -*- coding: utf-8 -*- """py2exe config.""" import sys import os if sys.platform == "win32": # Windows import py2exe from distutils.core import setup IMAGELIB_DIR = r"D:\Python\Python27\Lib\site-packages\PySide\plugins\imageformats" imgfiles = [os.path.join(IMAGELIB_DIR, i) for i in [ "qgif4.dll", "qgifd4.dll", "qico4.dll", "qicod4.dll", "qjpeg4.dll", "qjpegd4.dll", "qmng4.dll", "qmngd4.dll", "qsvg4.dll", "qsvgd4.dll", "qtga4.dll", "qtgad4.dll", "qtiff4.dll", "qtiffd4.dll", ]] data_files = [("imageformats", imgfiles)] py2exe_options = { "compressed": 1, "optimize": 2, "bundle_files": 3 } setup( data_files=data_files, options={"py2exe": py2exe_options}, # console = [ windows=[ {"script": "stampixelart.py"} ], zipfile="lib/libs.zip" ) if sys.platform == 'darwin': # OS X pass if sys.platform == 'linux2': # Linux pass
IMAGELIB_DIR のあたりは自分の環境に合わせて書き換える必要有。もしかすると setup.cfg なるものを書いてこのへん設定すべき、なのかもしれないけれどサンプルが見つからなくて…。
PySide の標準状態では扱える画像フォーマットがそれほど多くないので、plugins を使って svgその他に対応してるらしいのだけど。py2exe はそのあたりイイ感じにしてくれない。よって、必要になりそうな dll を imgfiles のあたりで全部列挙して data_files で渡してやって「コレもコピーしといてくれよな」と py2exe に指示してる、のだと思う。
py2exe に渡すオプションとしては compressed、optimize、bundle_files 等があるようだけど。"bundle_files" : 3 にすると、1つの exeファイルにアレもコレも入れるのではなく、各ファイルをバラバラにしておいてくれるらしいので、そのように。というのも、PySide ってライセンスがLGPLだったから、それぞれ個別のファイルになってないとマズいのかなと思ったわけで。それと、3 を指定しないとそもそもウチでは動かない、という話もチラホラ見かけたし。
setup() の個所で、console = [ ] と書けばコンソールアプリとして、windows=[ ] と書けばGUIアプリとして扱ってくれるらしい。
zipfile=None という記述もあちこで見かけたけど、手元の環境でソレをしたらエラーが出てしまった。仕方ないのでファイル名を指定。
◎ exe化を実行。 :
python setup.py py2exe と打てば、buildフォルダとdistフォルダが作られて、distフォルダの中にexe化されたソレが出来上がる。
distフォルダの中には、動作に必要な他のファイルも色々入ってるので、他の環境に渡す際はdistフォルダごと渡す、ものらしい。
py2exeは、exe化が終わると、最後に、「〜.dllも動作に必要なんだけどライセンスの問題で同梱するわけにはいかないのでそのあたりはそっちでどうにかしてくれよな」的に、ずらずらとdllの一覧を表示してくれる。今回、Windows10 x64 上で動かしたら、以下の一覧が出力された。
C:WINDOWS\system32\以下のファイルは、Windows環境ならたぶん入ってるんだろうと想像できるけど。MSVCP90.dll てのが…。
MSVCP90.dll は、Microsoft Visual C++ 2008 再頒布可能パッケージ (x86)、に入ってるらしい、が…。
_Microsoft Visual C++ 2008 再頒布可能パッケージ - 窓の杜ライブラリ
コレ、インストールしようとすると、一番容量が大きいHDDのルートフォルダに謎ファイルをばら撒くんだよな…。
更に。 _Using py2exe the right way | Python Tips によると、「コレをインストールしてみたんだけど相変わらず 『見つからねえぞ』って言われて、HDDの中を検索してたまたま見つかったヤツをアプリのフォルダにコピーしたら動いた」みたいな話もあるようで。
このあたり、結局どうすればいいのか、さっぱり分からず。
distフォルダの中には、動作に必要な他のファイルも色々入ってるので、他の環境に渡す際はdistフォルダごと渡す、ものらしい。
py2exeは、exe化が終わると、最後に、「〜.dllも動作に必要なんだけどライセンスの問題で同梱するわけにはいかないのでそのあたりはそっちでどうにかしてくれよな」的に、ずらずらとdllの一覧を表示してくれる。今回、Windows10 x64 上で動かしたら、以下の一覧が出力された。
*** binary dependencies *** Your executable(s) also depend on these dlls which are not included, you may or may not need to distribute them. Make sure you have the license if you distribute any of them, and make sure you don't distribute files belonging to the operating system. OLEAUT32.dll - C:\WINDOWS\system32\OLEAUT32.dll USER32.dll - C:\WINDOWS\system32\USER32.dll IMM32.dll - C:\WINDOWS\system32\IMM32.dll SHELL32.dll - C:\WINDOWS\system32\SHELL32.dll ole32.dll - C:\WINDOWS\system32\ole32.dll MSVCP90.dll - C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86\MSVCP90.dll WINMM.dll - C:\WINDOWS\system32\WINMM.dll COMDLG32.dll - C:\WINDOWS\system32\COMDLG32.dll ADVAPI32.dll - C:\WINDOWS\system32\ADVAPI32.dll WS2_32.dll - C:\WINDOWS\system32\WS2_32.dll WINSPOOL.DRV - C:\WINDOWS\system32\WINSPOOL.DRV GDI32.dll - C:\WINDOWS\system32\GDI32.dll VERSION.dll - C:\WINDOWS\system32\VERSION.dll KERNEL32.dll - C:\WINDOWS\system32\KERNEL32.dll
C:WINDOWS\system32\以下のファイルは、Windows環境ならたぶん入ってるんだろうと想像できるけど。MSVCP90.dll てのが…。
MSVCP90.dll は、Microsoft Visual C++ 2008 再頒布可能パッケージ (x86)、に入ってるらしい、が…。
_Microsoft Visual C++ 2008 再頒布可能パッケージ - 窓の杜ライブラリ
コレ、インストールしようとすると、一番容量が大きいHDDのルートフォルダに謎ファイルをばら撒くんだよな…。
更に。 _Using py2exe the right way | Python Tips によると、「コレをインストールしてみたんだけど相変わらず 『見つからねえぞ』って言われて、HDDの中を検索してたまたま見つかったヤツをアプリのフォルダにコピーしたら動いた」みたいな話もあるようで。
このあたり、結局どうすればいいのか、さっぱり分からず。
[ ツッコむ ]
以上です。