環境
OS: Windows 10
Pythonのバージョン: 3.6.3
Kivyを使ったGUIアプリを実行ファイルにする手段
以下のツール・パッケージを使ってPythonスクリプトを実行ファイルにすることができます。
- PyInstaller(Kivyが推奨している)
- Cx_Freeze
- Nuitka(Pythonコンパイラ)
- その他
今回はNuitkaを使います。
参考:
- https://github.com/kivy/kivy/wiki/Packaging-Kivy-apps-written-in-Python-3,-targeting-Windows-using-Nuitka
- http://nuitka.net/doc/user-manual.html
- https://qiita.com/mm_sys/items/1fd3a50a930dac3db299
なぜNuitka?
小サイズ
PyInstallerで生成されたexeファイルとNuitkaで生成されたexeファイルのファイルサイズを比べると、
その差は歴然です。
PyInstaller | Nuitka | |
---|---|---|
ファイルサイズ | 18355KB | 256KB |
PyInstallerだとちょっとしたスクリプトだけでもMB単位になってしまいますが、
Nuitkaなら気にする必要がなさそうです。
高速
PythonスクリプトをCに変換してから実行ファイルにしているので高速に動きます。
やってみよう
Nuitkaをインストールする
http://nuitka.net/pages/download.html
↑のリンクからダウンロードできますが、
今回はpipでインストールします。
pip install nuitka
または python -m pip install nuitka
Cコンパイラをインストールする
C11をサポートするコンパイラ、またはC++03をサポートするコンパイラが必要です。
- gcc
- clang
- MinGW64
- Visual Studio 2017
のどれか1つをインストールしてください。
http://nuitka.net/doc/user-manual.html#requirements
今回は Visual Studio 2017を使用しました。
Kivyアプリを実行ファイル化する
例として以下のスクリプト(main.py)を実行ファイルにします。
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
return Label(text="Hello world")
if __name__ == "__main__":
MyApp().run()
nuitkaでは以下のコマンドを使って実行ファイルにできます。
nuitka --recurse-none 実行ファイルにしたいスクリプトの場所
この例ではmain.pyを実行ファイルにしたいので、このようにします
nuitka --recurse-none main.py
実行すると、pythonxx.dll(xxはpythonのバージョン)と実行ファイルが生成されるはずです。
コンソール(コマンドプロンプト)を非表示にする
実行ファイルはできましたが、このまま起動するとコンソールも表示されてしまいます。
コンソールを表示しないようにするには
--windows-disable-console
オプションをつければ非表示にできます。
例:nuitka --recurse-none --windows-disable-console main.py
上記のコマンドで生成された実行ファイルを起動してみます。
すると…
…
何も起こりませんね。
nuitkaでコンソールを非表示にして起動するには、コンソールに何も出力しないようにする(kivyはログをコンソールに出力する)必要があります。
これを解決するには、stdin, stdout, stderrをコンソールで出力しないようにリダイレクトします。
このようにコードに記述します。
# --↓のコードを追加する--
import os
import sys
f = open(os.devnull, 'w')
sys.stderr = f
sys.stdout = f
sys.stdin = f
# ------------------------
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
return Label(text="Hello world")
if __name__ == "__main__":
MyApp().run()
そしてもう一度nuitka --recurse-none --windows-disable-console main.py
で実行ファイルを生成します。
起動すると、コンソールが非表示でウィンドウが表示されるはずです。
#配布時の注意(Windowsの場合)
Pythonがインストールされていない環境(*要検証)で
生成された実行ファイルを動かす際、
- pythonxx.dll(xxはpythonのバージョン)
- vcruntime140.dll
- pythonxx.zip
※(Pythonをインストールしてあるディレクトリや、Python公式の埋め込み用PythonのZipファイルに含まれているので、そこから入手できますhttps://www.python.org/ftp/python/3.7.1/python-3.7.1rc1-embed-amd64.zip リンク先は64bit版のファイルです)
を参照します。同じディレクトリに置いておきましょう。