Quick search

Create a package for Windows(翻訳済み)

注釈

この文章はkivy 1.9.1 以降のバージョンが対象です。

Windowsプラットフォーム用のアプリケーションのパッケージは、Windows OS内でできます。次のプロセスはKivy wheelsのインストールをwindowsにインストールし、インストールの終了までテストされています。

パッケージは実行したPythonのバージョンに応じて32bit,64bitのどちらかになります。

Requirements(要件)

PyInstaller default hook(PyInstallerのデフォルトhookについて)

このセクションはKivy hookを含むPyInstaller(> = 3.1)に適用されます。デフォルトのhookを上書きするには、以下の例を少し変更する必要があります。Overwriting the default hook(デフォルトhookを上書きします) を参照してください。

Packaging a simple app(シンプルなアプリのパッケージ化)

この例では、touchtracerサンプルプロジェクトをパッケージ化し、カスタムアイコンを埋め込みます。wheelを使用してインストールしている場合、kivyのサンプルコードの場所は「python\\share\\kivy-examples」にgithubのソースコードをインストールして使用するときは 「kivy\\examples」 にあります 。サンプルコードに至る絶対パスexamples-pathパスを参照します。touchtracerの例があるexamples-path\demo\touchtracerとメインファイルは「main.py」です

  1. コマンドラインシェルを開き、pythonがパス上にあることを確認します(つまり、pythonが動作する事)

  2. パッケージ化するアプリを作成するフォルダを作成します。例えば「TouchApp」フォルダを作成し、 「cd TouchApp」のように入力してその `ディレクトリに移動します<http://www.computerhope.com/cdhlp.htm>`_ 。以下のように入力します”

    python -m PyInstaller --name touchtracer examples-path\demo\touchtracer\main.py
    

    また実行可能ファイルのアイコンを作成するために、アプリケーションフォルダに icon.ico ファイルを追加できます。利用可能な.icoファイルがない場合は、Webアプリケーションの ConvertICO を使用して「icon.png」ファイルを変換することができます。touchtracerディレクトリに 「icon.ico」 を保存して入力します:

    python -m PyInstaller --name touchtracer --icon examples-path\demo\touchtracer\icon.ico examples-path\demo\touchtracer\main.py
    

    より多くのオプションについては、`pyInstallerのマニュアル<http://pythonhosted.org/PyInstaller/>`_ を参照してください 。

  3. specファイルは「TouchApp」の場合は「touchtracer.spec」 として配置されています 。正しく動作するexeファイルを構築するためには、依存関係のhookを追加するためにspecファイルを編集する必要があります。 お気に入りのエディタでspecファイルを開いて、仕様の先頭に次の行を追加します(仮にsdl2がデフォルトで使用されている場合):

    from kivy.deps import sdl2, glew
    

    「COLLECT()」 にtouchtracerのデータ(「touchtracer.kv」, 「particle.png」、...)を追加します。「Tree()」オブジェクトに追加する行を加えます(例:「Tree(‘examples-path\\demo\\touchtracer\\’)」)。Treeはtouchtracerディレクトリにあるすべてのファイルを検索して最終的なパッケージに追加します。

    COLLECT依存関係の最初のキーワード引数の前にTreeオブジェクトのすべてのパスに依存関係を追加します。例えば「*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)]」 の場合は次のようになります:

    coll = COLLECT(exe, Tree('examples-path\\demo\\touchtracer\\'),
                   a.binaries,
                   a.zipfiles,
                   a.datas,
                   *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
                   strip=False,
                   upx=True,
                   name='touchtracer')
    
  4. 「TouchApp」 のspecファイルをビルドします:

    python -m PyInstaller touchtracer.spec
    
  5. コンパイルされたパッケージは「TouchApp\\dist\\touchtracer」ディレクトリに生成されます。

Packaging a video app with gstreamer(gstreamerのビデオアプリをパッケージ化)

後はビデオ用のgstreamerを使用するアプリケーションをパッケージ化するために上記の例を少し修正します。使用する 「videoplayer」 は「examples-path\widgets\videoplayer.py」 にあります。「VideoPlayer」フォルダを作成してコマンドラインでそのフォルダにカレントディレクトリを変更し次を実行します:

python -m PyInstaller --name gstvideo examples-path\widgets\videoplayer.py

「gstvideo.spec」 ファイルを作成します。そのうえで、この時gstreamerをインクルードするように編集してください:

from kivy.deps import sdl2, glew, gstreamer

「Tree()」 にビデオファイルをインクルードしたように追加をします。gstreamerの依存関係と同様に Tree('examples-path\\\\widgets') にこのように追加します。

coll = COLLECT(exe, Tree('examples-path\\widgets'),
               a.binaries,
               a.zipfiles,
               a.datas,
               *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins + gstreamer.dep_bins)],
               strip=False,
               upx=True,
               name='gstvideo')

「VideoPlayer」 のspecファイルをビルドします:

python -m PyInstaller gstvideo.spec

ビデオを再生するときには 「VideoPlayer\dist\gstvideo」でgstvideo.exeが存在している必要があります。

注釈

Pygameを使用していて、アプリのパッケージにPygameが必要な場合は、 kivy issue #1638にあるようにspecファイルに次のコードを追加してください。importの後に追加します:

def getResource(identifier, *args, **kwargs):
    if identifier == 'pygame_icon.tiff':
        raise IOError()
    return _original_getResource(identifier, *args, **kwargs)

import pygame.pkgdata
_original_getResource = pygame.pkgdata.getResource
pygame.pkgdata.getResource = getResource

Overwriting the default hook(デフォルトhookを上書きします)

Including/excluding video and audio and reducing app size(Videoとaudioを引き込むのを除くことでアプリのサイズを縮小する)

PyInstallerのデフォルトはkivy、例えばオーディオ、ビデオ、スペルなど使用される すべての のコアモジュールをhookに追加します。(「Tree()」を使用して手動でgstreamerのDLLをパッケージ化する必要があります - 下記の例を参照してください。)。hookがインストールされていないか、オーディオ/ビデオを使用しない場合でアプリケーションサイズを縮小する場合はこれらのモジュールのいくつかは、別のhookにするか除外してもよいです

Kivyは hookspath() で代替hookを提供します 。 PyInstallerのデフォルトのhookがない場合に限り、 runtime_hooks() も提供されなければなりません。 hookを上書きするときに、 runtime_hooks()は通常は上書きする必要はありません。

hookspath() の代替hockはkivyプロバイダのどれかが含まれてません。追加するには、get_deps_minimal() または get_deps_all() で追加する必要があります。詳細については、 get_deps_minimal()get_deps_all() ドキュメントと” “pyinstaller_hooks を参照してください。しかしながら本質的には、 get_deps_all() でデフォルトhookにすべてのプロバイダを追加するか get_deps_minimal() でアプリの実行時にロードされているものを追加します。それぞれの方法は「Analysis」に渡せます。そしてkivyの隠れたimport、または除外されたimportのリストを提供します。

1つの方法は、文字通りすべてのkivyプロバイダモジュールをリスト化し、必要でないものはコメントアウトして代替hookを生成します。pyinstaller_hooks を参照してください。

上記の例と代替hookにhookを追加するには、次のように``hookspath()`` と runtime_hooks (必要な場合)と``**get_deps_minimal()``または``**get_deps_all()``プロバイダを指定して使用します。

たとえば、import文を追加します:

from kivy.tools.packaging.pyinstaller_hooks import get_deps_minimal, get_deps_all, hookspath, runtime_hooks

次のように Analysis を変更します。

a = Analysis(['examples-path\\demo\\touchtracer\\main.py'],
             ...
             hookspath=hookspath(),
             runtime_hooks=runtime_hooks(),
             ...
             **get_deps_all())

デフォルトのhookのようなものがすべて含まれています。または:

a = Analysis(['examples-path\\demo\\touchtracer\\main.py'],
             ...
             hookspath=hookspath(),
             runtime_hooks=runtime_hooks(),
             ...
             **get_deps_minimal(video=None, audio=None))

例えばオーディオプロバイダとビデオプロバイダを除外した上で他のコアモジュールはロードされたもののみを使用します。

キーポイントは、代替を提供する hookspath() 代わりに手動で含まれていない隠れたimportsとデフォルトで表示されないすべてのkivyプロバイダーと望ましくないもの(この例ではaudioとvideo)を get_deps_minimal() で除去し、必要なプロバイダを追加します。

Alternate installations(インストールの代替)

前の例は、「*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins + gstreamer.dep_bins)],」 を使用する場合は pyInstallerでの作成ですべてのDLLを追加し、依存関係で使用されます。 kivy wheel メソッドを使用してインストールされていない場合、これらのコマンドは動作しませんし例えば「kivy.deps.sdl2」のimportに失敗します。その代わりに、一つの方法としてはこれらのDLLの場所を見つけて「Tree」クラスの例と同様の方法で手動に渡す必要があります。