lisz-works

技術と興味の集合体

pyinstallでpython→exeしてみた!

【スポンサーリンク】

Python ロゴ

*pyinstaller」で、Pythonをexe化してみました!

実装したソースファイルと、コマンドだけでexe化できます!

以前「cx_Freeze」でexeを作った記事はコチラ。

www.lisz-works.com

まずは下準備

それでは準備をしていきましょう。

今回は主にこのページを参考に進めていきました。

qiita.com

出力結果は長いので、非表示にしておきます。

中身を見たければ「表示」を選択してください!

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が入ります!

どうでもいいけど、アイコンがかわいい。

pyinstall 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

参考

これらのページを参考にしました。

ありがとうございました。

qiita.com

qiita.com

qiita.com

あとがき

これで楽々とexe化できちゃいますね。

バッチファイル的な感覚で、サクっと実行するような処理にはかなり使えるかもしれない予感……

比較とかをしていないので、cx_Freezeとの差はどの程度か分かりませんが、楽に作成できるので、コイツを活用していこうと思っています!

www.lisz-works.com