40
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

KivyのGUIアプリをNuitkaで簡単に小サイズの実行ファイル(exe)にする(Windows10)

Last updated at Posted at 2018-01-09

環境

OS: Windows 10
Pythonのバージョン: 3.6.3

Kivyを使ったGUIアプリを実行ファイルにする手段

以下のツール・パッケージを使ってPythonスクリプトを実行ファイルにすることができます。

  • PyInstaller(Kivyが推奨している)
  • Cx_Freeze
  • Nuitka(Pythonコンパイラ)
  • その他

今回はNuitkaを使います。

参考:

なぜ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をサポートするコンパイラが必要です。

Kivyアプリを実行ファイル化する

例として以下のスクリプト(main.py)を実行ファイルにします。

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をコンソールで出力しないようにリダイレクトします。
このようにコードに記述します。

main.py
# --↓のコードを追加する--
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版のファイルです)

を参照します。同じディレクトリに置いておきましょう。

40
45
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?