「pyinstaller」で、Pythonをexe化してみました!
実装したソースファイルと、コマンドだけでexe化できます!
以前「cx_Freeze」でexeを作った記事はコチラ。
まずは下準備
それでは準備をしていきましょう。
今回は主にこのページを参考に進めていきました。
出力結果は長いので、非表示にしておきます。
中身を見たければ「表示」を選択してください!
virtualenvの準備
教えの通り「virtualenv」と「virtualenvwrapper-win」をインストールします。
この2つのコマンドを叩きます。
pip install virtualenv pip install virtualenvwrapper-win
表示
C:\pyinstaller\test>pip install virtualenv Collecting virtualenv Downloading virtualenv-15.1.0-py2.py3-none-any.whl (1.8MB) 100% |████████████████████████████████| 1.8MB 536kB/s Installing collected packages: virtualenv Successfully installed virtualenv-15.1.0 C:\pyinstaller\test>pip install virtualenvwrapper-win Collecting virtualenvwrapper-win Downloading virtualenvwrapper-win-1.2.5.tar.gz Requirement already satisfied: virtualenv in c:\users\lis\appdata\local\continuu m\anaconda3\lib\site-packages (from virtualenvwrapper-win) Building wheels for collected packages: virtualenvwrapper-win Running setup.py bdist_wheel for virtualenvwrapper-win ... done Stored in directory: C:\Users\lis\AppData\Local\pip\Cache\wheels\84\82\75\0b06 735fbb6c7fd41833aeb953cf1f606f851e04cc3f96aac3 Successfully built virtualenvwrapper-win Installing collected packages: virtualenvwrapper-win Successfully installed virtualenvwrapper-win-1.2.5
virtualenvで仮想環境を作る
次にこのコマンドで、仮想環境を作ります。
mkvirtualenv <環境名>
ぼくは「pyinst」という名前にしたので、こんな感じ。
mkvirtualenv pyinst
成功すると「C:\Users\<ユーザ名>\Envs」に、環境名でフォルダが作成されます!
表示
C:\pyinstaller\test>mkvirtualenv pyinst C:\Users\lis\Envs is not a directory, creating Using base prefix 'c:\\users\\lis\\appdata\\local\\continuum\\anaconda3' New python executable in C:\Users\lis\Envs\pyinst\Scripts\python.exe Installing setuptools, pip, wheel...done. (pyinst) C:\pyinstaller\test>dir /b /ad "C:\Users\lis\Envs" pyinst
その他必要なものをインストール
次に仮想環境に、その他の必要なものをインストールしていく。
「pywin32」と「easy_install」も入れておきましょうと書かれていたので従う。
この2つを叩きます。
pip install pywin32 pip install easy_install
表示
(pyinst) C:\pyinstaller\test>pip install pywin32 Collecting pywin32 Downloading pywin32-222-cp36-cp36m-win_amd64.whl (9.0MB) 100% |████████████████████████████████| 9.0MB 121kB/s Installing collected packages: pywin32 Successfully installed pywin32-222
と思ったらeasy_installでエラー……
(pyinst) C:\pyinstaller\test>pip install easy_install Collecting easy_install Could not find a version that satisfies the requirement easy_install (from versions: ) No matching distribution found for easy_install
このエラーはGoogle先生曰く
easy_installの要件を満たすバージョンが見つかりませんでした(バージョン:から)easy_installの一致するディストリビューションが見つかりません
とのことでした。
大丈夫な気がするので、まぁ一旦スルー。
pyinstallerをインストール
これが今回の核ですね。
pyinstallerも入れます。
pip install pyinstaller
表示
(pyinst) C:\pyinstaller\test>pip install pyinstaller Collecting pyinstaller Downloading PyInstaller-3.3.1.tar.gz (3.5MB) 100% |████████████████████████████████| 3.5MB 300kB/s Requirement already satisfied: setuptools in c:\users\lis\envs\pyinst\lib\site-p ackages (from pyinstaller) Collecting pefile>=2017.8.1 (from pyinstaller) Downloading pefile-2017.11.5.tar.gz (61kB) 100% |████████████████████████████████| 71kB 3.6MB/s Collecting macholib>=1.8 (from pyinstaller) Downloading macholib-1.9-py2.py3-none-any.whl (40kB) 100% |████████████████████████████████| 40kB 2.9MB/s Collecting future (from pyinstaller) Collecting altgraph>=0.15 (from macholib>=1.8->pyinstaller) Downloading altgraph-0.15-py2.py3-none-any.whl Building wheels for collected packages: pyinstaller, pefile Running setup.py bdist_wheel for pyinstaller ... done Stored in directory: C:\Users\lis\AppData\Local\pip\Cache\wheels\2f\f8\8e\d8ee 9b359f487a8488380f0b522d81fa5ee01956161d41b72e Running setup.py bdist_wheel for pefile ... done Stored in directory: C:\Users\lis\AppData\Local\pip\Cache\wheels\30\34\1d\5f4e 14feee63c615a1ae25c211b21237a6a74c1c4fb6639842 Successfully built pyinstaller pefile Installing collected packages: future, pefile, altgraph, macholib, pyinstaller Successfully installed altgraph-0.15 future-0.16.0 macholib-1.9 pefile-2017.11.5 pyinstaller-3. 3.1
pyinstaller実行!
やっとexe作成です!
今回exe化するソースは、Hello worldを表示するだけの、test.pyというソースです。
#!python # coding: utf-8 print("hello world")
ということで、test.pyをexe化してもらいます。
pyinstaller test.py
実行!
表示
(pyinst) C:\pyinstaller\test>pyinstaller test.py 373 INFO: PyInstaller: 3.3.1 374 INFO: Python: 3.6.0 375 INFO: Platform: Windows-7-6.1.7601-SP1 378 INFO: wrote C:\pyinstaller\test\test.spec 383 INFO: UPX is not available. 386 INFO: Extending PYTHONPATH with paths ['C:\\TMP\\py\\pyinstaller\\test', 'C:\\TMP\\py\\pyinstaller\\test'] 387 INFO: checking Analysis 387 INFO: Building Analysis because out00-Analysis.toc is non existent 388 INFO: Initializing module dependency graph... 392 INFO: Initializing module graph hooks... 395 INFO: Analyzing base_library.zip ... 6057 INFO: running Analysis out00-Analysis.toc 6084 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable required by c:\users\lis\envs\pyinst\scripts\python.exe 7341 INFO: Caching module hooks... 7351 INFO: Analyzing C:\pyinstaller\test\test.py 7356 INFO: Loading module hooks... 7357 INFO: Loading module hook "hook-encodings.py"... 7517 INFO: Loading module hook "hook-pydoc.py"... 7518 INFO: Loading module hook "hook-xml.py"... 8153 INFO: Looking for ctypes DLLs 8153 INFO: Analyzing run-time hooks ... 8163 INFO: Looking for dynamic libraries 8462 INFO: Looking for eggs 8463 INFO: Using Python library c:\users\lis\envs\pyinst\scripts\python36.dll 8464 INFO: Found binding redirects: [] 8469 INFO: Warnings written to C:\pyinstaller\test\build\test\warntest.txt 8554 INFO: Graph cross-reference written to C:\pyinstaller\test\build\test\xref-test.htm l 8590 INFO: checking PYZ 8591 INFO: Building PYZ because out00-PYZ.toc is non existent 8592 INFO: Building PYZ (ZlibArchive) C:\pyinstaller\test\build\test\out00-PYZ.pyz 9702 INFO: Building PYZ (ZlibArchive) C:\pyinstaller\test\build\test\out00-PYZ.pyz compl eted successfully. 9719 INFO: checking PKG 9719 INFO: Building PKG because out00-PKG.toc is non existent 9720 INFO: Building PKG (CArchive) out00-PKG.pkg 9744 INFO: Building PKG (CArchive) out00-PKG.pkg completed successfully. 9747 INFO: Bootloader c:\users\lis\envs\pyinst\lib\site-packages\PyInstaller\boo tloader\Windows-64bit\run.exe 9748 INFO: checking EXE 9748 INFO: Building EXE because out00-EXE.toc is non existent 9749 INFO: Building EXE from out00-EXE.toc 9751 INFO: Appending archive to EXE C:\pyinstaller\test\build\test\test.exe 9766 INFO: Building EXE from out00-EXE.toc completed successfully. 9771 INFO: checking COLLECT 9771 INFO: Building COLLECT because out00-COLLECT.toc is non existent 9772 INFO: Building COLLECT out00-COLLECT.toc 9841 INFO: Updating manifest in C:\Users\lis\AppData\Roaming\pyinstaller\bincach e00_py36_64bit\python36.dll 9855 INFO: Updating resource type 24 name 2 language 1033 10523 INFO: Updating manifest in C:\Users\lis\AppData\Roaming\pyinstaller\bincac he00_py36_64bit\_ssl.pyd 10524 INFO: Updating resource type 24 name 2 language 1033 10586 INFO: Updating manifest in C:\Users\lis\AppData\Roaming\pyinstaller\bincac he00_py36_64bit\unicodedata.pyd 10587 INFO: Updating resource type 24 name 2 language 1033 10621 INFO: Updating manifest in C:\Users\lis\AppData\Roaming\pyinstaller\bincac he00_py36_64bit\pyexpat.pyd 10622 INFO: Updating resource type 24 name 2 language 1033 10704 INFO: Updating manifest in C:\Users\lis\AppData\Roaming\pyinstaller\bincac he00_py36_64bit\_hashlib.pyd 10705 INFO: Updating resource type 24 name 2 language 1033 10749 INFO: Updating manifest in C:\Users\lis\AppData\Roaming\pyinstaller\bincac he00_py36_64bit\_bz2.pyd 10751 INFO: Updating resource type 24 name 2 language 1033 10813 INFO: Updating manifest in C:\Users\lis\AppData\Roaming\pyinstaller\bincac he00_py36_64bit\_lzma.pyd 10814 INFO: Updating resource type 24 name 2 language 1033 10837 INFO: Updating manifest in C:\Users\lis\AppData\Roaming\pyinstaller\bincac he00_py36_64bit\_socket.pyd 10838 INFO: Updating resource type 24 name 2 language 1033 10856 INFO: Updating manifest in C:\Users\lis\AppData\Roaming\pyinstaller\bincac he00_py36_64bit\select.pyd 10857 INFO: Updating resource type 24 name 2 language 1033 10880 INFO: Building COLLECT out00-COLLECT.toc completed successfully.
「10880 INFO: Building COLLECT out00-COLLECT.toc completed successfully.」
と出ていますね!
成功しました!
「.\dist\<名称>」にexeが入ります!
どうでもいいけど、アイコンがかわいい。
……が、なんか大量のファイル。
うざいですよね?
このファイルの山から、exeだけ引っ張ってきて実行してもエラーします。
C:\pyinstaller\test>test Error loading Python DLL 'C:\pyinstaller\test\python36.dll'. LoadLibrary: 指定されたモジュールが見つかりません。
ということでファイルを1つにして頂きましょう!
exeにファイルを集約してもらう
これをこうして……(コマンドに「--onefile」オプションを付ける)
pyinstaller test.py --onefile
表示
(pyinst) C:\pyinstaller\test>pyinstaller test.py --onefile 386 INFO: PyInstaller: 3.3.1 386 INFO: Python: 3.6.0 388 INFO: Platform: Windows-7-6.1.7601-SP1 390 INFO: wrote C:\pyinstaller\test\test.spec 395 INFO: UPX is not available. 397 INFO: Extending PYTHONPATH with paths ['C:\\TMP\\py\\pyinstaller\\test', 'C:\\TMP\\py\\pyinstaller\\test'] 398 INFO: checking Analysis 418 INFO: checking PYZ 433 INFO: checking PKG 434 INFO: Building because toc changed 435 INFO: Building PKG (CArchive) out00-PKG.pkg 2562 INFO: Building PKG (CArchive) out00-PKG.pkg completed successfully. 2567 INFO: Bootloader c:\users\lis\envs\pyinst\lib\site-packages\PyInstaller\boo tloader\Windows-64bit\run.exe 2568 INFO: checking EXE 2569 INFO: Rebuilding out00-EXE.toc because test.exe missing 2570 INFO: Building EXE from out00-EXE.toc 2571 INFO: Appending archive to EXE C:\pyinstaller\test\dist\test.exe 2619 INFO: Building EXE from out00-EXE.toc completed successfully.
こうじゃ(.\dist\<名称>.exe爆誕)
実行するとちゃんと動きます!
C:\pyinstaller\test\dist>test hello world
参考
これらのページを参考にしました。
ありがとうございました。
あとがき
これで楽々とexe化できちゃいますね。
バッチファイル的な感覚で、サクっと実行するような処理にはかなり使えるかもしれない予感……
比較とかをしていないので、cx_Freezeとの差はどの程度か分かりませんが、楽に作成できるので、コイツを活用していこうと思っています!