Windows10 64bit Python ３.10.x へのKivy 2.x開発環境の構築手順

https://ja.wikipedia.org/wiki/Kivy ってなに？って人は一度ここのギャラリhttps://pyky.github.io/kivy-doc-ja/examples/gallery.html とか [Python Kivyのexample配下を整理してみた](https://qiita.com/dario_okazaki/items/24d77d593094e9349d14)を観るとよいと思います。

Kivy 2.0.0のPython 3.10をサポートしていなかったときの記事です。Kivy 2.1.0はPython 3.7-3.10をサポートしています。

#概要
[Kivy](https://kivy.org)(Android、iOS、Linux、MacOS X、Windows上のクロスプラットフォームで動作)の[2.0.0 releases](https://github.com/kivy/kivy/releases/tag/2.0.0)によればPythonのサポートバージョンは3.6から3.9.となっています。Windwos10上のPython 3.10.xでkivyをインストールしようとすると、



```console
Code and Logs and screenshots
Examples of errors:

ERROR: Could not find a version that satisfies the requirement kivy_deps.gstreamer_dev~=0.3.1 (from versions: none)
ERROR: No matching distribution found for kivy_deps.gstreamer_dev~=0.3.1...
```

[issues#7654](https://github.com/kivy/kivy/issues/7654)

https://github.com/kivy/kivy/issues/7654

のように

```console
(venv_dir) python -m pip install kivy[base]==2.0.0
Collecting kivy[base]==2.0.0
  Using cached Kivy-2.0.0.tar.gz (23.7 MB)
  Installing build dependencies ... error
  ERROR: Command errored out with exit status 1:
   command: 'python.exe' 'pip' install --ignore-installed --no-user --prefix 'Temp\pip-build-env-mgjhh2_q\overlay' --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- setuptools wheel 'cython>=0.24,<=0.29.21,!=0.27,!=0.27.2' 'kivy_deps.gstreamer_dev~=0.3.1; sys_platform == "win32"' 'kivy_deps.sdl2_dev~=0.3.1; sys_platform == "win32"' 'kivy_deps.glew_dev~=0.3.0; sys_platform == "win32"' 'kivy_deps.gstreamer~=0.3.1; sys_platform == "win32"' 'kivy_deps.sdl2~=0.3.1; sys_platform == "win32"' 'kivy_deps.glew~=0.3.0; sys_platform == "win32"'
       cwd: None
  Complete output (10 lines):
  Collecting setuptools
    Using cached setuptools-60.2.0-py3-none-any.whl (953 kB)
  Collecting wheel
    Using cached wheel-0.37.1-py2.py3-none-any.whl (35 kB)
  Collecting cython!=0.27,!=0.27.2,<=0.29.21,>=0.24
    Using cached Cython-0.29.21-py2.py3-none-any.whl (974 kB)
  Collecting kivy_deps.gstreamer_dev~=0.3.1
    Using cached kivy_deps.gstreamer_dev-0.3.2-cp310-cp310-win_amd64.whl (3.9 MB)
  ERROR: Could not find a version that satisfies the requirement kivy_deps.sdl2_dev~=0.3.1 (from versions: 0.4.2, 0.4.3)
  ERROR: No matching distribution found for kivy_deps.sdl2_dev~=0.3.1
  ----------------------------------------
WARNING: Discarding https://files.pythonhosted.org/.../Kivy-2.0.0.tar.gz#... (from https://pypi.org/simple/kivy/). Command errored out with exit status 1: 'python.exe' 'pip' install --ignore-installed --no-user --prefix 'Temp\pip-build-env-mgjhh2_q\overlay' --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- setuptools wheel 'cython>=0.24,<=0.29.21,!=0.27,!=0.27.2' 'kivy_deps.gstreamer_dev~=0.3.1; sys_platform == "win32"' 'kivy_deps.sdl2_dev~=0.3.1; sys_platform == "win32"' 'kivy_deps.glew_dev~=0.3.0; sys_platform == "win32"' 'kivy_deps.gstreamer~=0.3.1; sys_platform == "win32"' 'kivy_deps.sdl2~=0.3.1; sys_platform == "win32"' 'kivy_deps.glew~=0.3.0; sys_platform == "win32"' Check the logs for full command output.
ERROR: Could not find a version that satisfies the requirement kivy[base]==2.0.0 (from versions: 1.0.1a0, 1.0.2a0, 1.0.3a0, 1.0.4b0, 1.0.5, 1.0.6, 1.0.7, 1.0.8, 1.0.9, 1.1.0, 1.1.1, 1.2.0, 1.3.0, 1.4.0, 1.4.1, 1.5.0, 1.5.1, 1.6.0, 1.7.0, 1.7.1, 1.7.2, 1.8.0, 1.9.0, 1.9.1, 1.10.0, 1.10.1, 1.11.0rc1, 1.11.0rc2, 1.11.0, 1.11.1, 2.0.0rc1, 2.0.0rc2, 2.0.0rc3, 2.0.0rc4, 2.0.0)
ERROR: No matching distribution found for kivy[base]==2.0.0
```

となり依存関係により、インストールができません。

リリース版で依存関係の制約が解除されると次のような操作で一式がインストールできるはずです。

```console
ex.
C:> python -m pip install kivy[base,media,tuio] kivy_examples --no-binary kivy
or
C:> python -m pip install kivy[base] kivy_examples --no-binary kivy
or
C:> python -m pip install kivy[sdl2] kivy_examples --no-binary kivy
```

Python並びにKivyのサポートバージョンを合わせることで解決できますが、開発途中の状況で開発を続けたい人のための環境構築手順についての資料です。

なおこの手順はkivyのみの開発環境について記載していますので、関係する依存関係のものを開発する場合は適宜手法を適用してください。

## 参考にした情報
* [Installing Kivy — Kivy 2.0.0 documentation](https://kivy.org/doc/stable/gettingstarted/installation.html)
* [Using Visual C Build Tools instead of Visual Studio on Windows · kivy/kivy Wiki](https://github.com/kivy/kivy/wiki/Using-Visual-C---Build-Tools-instead-of-Visual-Studio-on-Windows)
* [Installation on Windows(翻訳済み) — Kivy 1.10.0 ドキュメント](https://pyky.github.io/kivy-doc-ja/installation/installation-windows.html)

##前提環境
* Windows10 [Microsoft Windows [Version 10.0.19044.1415]](https://www.microsoft.com/ja-jp/software-download/windows10)
* python-3.10.1-amd64.exe [Python 3.10.1
](https://www.python.org/downloads/release/python-3101/)
* vs_BuildTools.exe [Visual Studio 2022 Build Tools](https://docs.microsoft.com/en-us/visualstudio/install/create-an-offline-installation-of-visual-studio?view=vs-2022) 
、 https://visualstudio.microsoft.com/ja/downloads/ "C++ によるデスクトップ開発" ワークロードを選択してインストールしておきます。https://docs.microsoft.com/ja-jp/cpp/build/building-on-the-command-line
* Git-2.34.1-64-bit.exe [Git for windows](https://gitforwindows.org/)

#構築手順

##環境確認
### gitの版数確認
```console:cmdプロンプト下
C:> git --version
git version 2.34.1.windows.1
```

### Visual Studio 2022 Build Toolsの設定
```console:cmdプロンプト下
C:>  "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvarsall.bat"
```
vcvarsall.batにオプションをつけないとヘルプを得られます。


### Pythonインストーラでデフォルトで入れていない人の確認事項
PythonインストーラではPATH変数はインストーラで設定せずに後から個別に設定したほうが未知の影響から逃れるため良いかもしれないと思われている方は、この節を見ながら環境を確認して個別に開発環境毎のPATH変数を設定してください。
Pythonの[WindowsでPython を使う](https://docs.python.org/ja/3/using/windows.html)資料を熟知している方は軽く読み流して下さい。

```console:PATHが通っていない場合(引数あり)
C:> python --version
Python
```
Pythonという文字列が返ってくる。

```console:PATHが通ってない場合(引数無し)
C:> python
```
Microsoft Storeが起動する。

```console:Windowsで導入したpythonの状況を確認する
C:> py --list
Installed Pythons found by py Launcher for Windows
 -3.10-64 *
C:> py --list-paths
Installed Pythons found by py Launcher for Windows
 -3.10-64       %LOCALAPPDATA%\Programs\Python\Python310\python.exe *
```

:::note warn
PATH変数には上記を参考に次の値などを追加すること
%LOCALAPPDATA%\Programs\Python\Python310\Scripts
%LOCALAPPDATA%\Programs\Python\Python310
:::

その他有益な情報が[「Pythonが動かない…」の簡単な解決方法（Windows）](https://gammasoft.jp/blog/resolve-not-to-run-python/)などに記載されているようです。

```console:PATHが通ってる場合
(venv_dir) C:> python
Python 3.10.1 (tags/v3.10.1:2cd268a, Dec  6 2021, 19:10:37) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> quit();

(venv_dir) >
```

### Pythonの版数確認

```console
C:> ver
Microsoft Windows [Version 10.0.19044.1415]
C:> wmic os get osarchitecture
OSArchitecture
64 ビット
C:> python --version
Python 3.10.1
C:> python -m pip list
Package    Version
---------- -------
pip        21.2.4
setuptools 58.1.0
WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available.
You should consider upgrading via the '%PythonInstallPath%\Python\Python310\python.exe -m pip install --upgrade pip' command.

C:> python -m pip list -o
Package    Version Latest Type
---------- ------- ------ -----
pip        21.2.4  21.3.1 wheel
setuptools 58.1.0  60.2.0 wheel
WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available.
You should consider upgrading via the 'C:\Users\%USERNAME%\AppData\Local\Programs\Python\Python310\python.exe -m pip install --upgrade pip' command.
```
:::note info
%PythonInstallPath%や%USERNAME%はインストール環境によって違います。そして変数は展開されています。
:::


##Python venv仮想環境の作成(初回だけ)

[Python venv](https://docs.python.org/ja/3.10/library/venv.html#module-venv)を使って仮想環境を作りましょう。[Installing Kivy — Kivy 2.0.0 documentation](https://kivy.org/doc/stable/gettingstarted/installation.html)では[virtualenv](https://virtualenv.pypa.io/en/latest/)を使っていますのでそちらの方が良いかも入れませんが、Python的にはvenvが推奨だといもいます。https://docs.python.org/ja/3/installing/index.html

```console
C:> python -m venv ./venv_dir
```
venv_dir配下に仮想環境が構築されます。


##Python venv仮想環境の有効化

```console
C:> venv_dir\Scripts\activate.bat
(venv_dir) > 
```
:::note alert
コマンドプロンプトが変化します
:::
この仮想環境下で作業する限りPythonで他のプロダクトにお互い影響なく作業ができます。


## Kivy 2.0.0の依存を仮想環境にインストール

```console:コマンドプロンプトが仮想環境に変化していることを確認
(venv_dir) > 
```
```console:次のコマンドを投入します
python -m pip install --upgrade pip
python -m pip install -U Cython wheel setuptools docutils pygments pypiwin32
python -m pip install kivy.deps.sdl2     kivy.deps.glew
python -m pip install kivy.deps.sdl2_dev kivy.deps.glew_dev
python -m pip install kivy.deps.gstreamer
python -m pip install kivy.deps.gstreamer_dev
python -m pip install kivy_examples
```
## 仮想環境のインストール状況を確認
```console
(venv_dir) > pip list
Package                 Version
----------------------- -------
Cython                  0.29.26
docutils                0.18.1
kivy-deps.glew          0.3.0
kivy-deps.glew-dev      0.3.0
kivy-deps.gstreamer     0.3.2
kivy-deps.gstreamer-dev 0.3.2
kivy-deps.sdl2          0.4.3
kivy-deps.sdl2-dev      0.4.3
Kivy-examples           1.11.1
pip                     21.3.1
Pygments                2.10.0
pypiwin32               223
pywin32                 303
setuptools              60.2.0
wheel                   0.37.1

(venv_dir) > pip list -o
Package       Version Latest Type
------------- ------- ------ -----
Kivy-examples 1.11.1  2.0.0  wheel
```

# dev環境の構築
## リリース版での依存関係のロックを解除するための編集

当然、サポートバージョンではありませんのでサポート外です。issuesを上げるときは留意しましょう。

```console:gitからkivyを取り出します
git clone https://github.com/kivy/kivy
```
:::note alert
冒頭のエラーは次のファイルに記載の依存関係の版数情報と、コンパイル済の提供状況によって発生しています。
kivy\pyproject.toml
kivy\setup.cfg
:::

```diff:kivy\pyproject.tomlファイル
@@ -1,15 +1,15 @@
 [build-system]
 requires = [
     "setuptools", "wheel",
-    "cython>=0.24,<=0.29.21,!=0.27,!=0.27.2",
-    'kivy_deps.gstreamer_dev~=0.3.1; sys_platform == "win32"',
-    'kivy_deps.sdl2_dev~=0.3.1; sys_platform == "win32"',
-    'kivy_deps.glew_dev~=0.3.0; sys_platform == "win32"',
-    'kivy_deps.gstreamer~=0.3.1; sys_platform == "win32"',
-    'kivy_deps.sdl2~=0.3.1; sys_platform == "win32"',
-    'kivy_deps.glew~=0.3.0; sys_platform == "win32"',
+    "cython",
+    'kivy_deps.gstreamer_dev; sys_platform == "win32"',
+    'kivy_deps.sdl2_dev; sys_platform == "win32"',
+    'kivy_deps.glew_dev; sys_platform == "win32"',
+    'kivy_deps.gstreamer; sys_platform == "win32"',
+    'kivy_deps.sdl2; sys_platform == "win32"',
+    'kivy_deps.glew; sys_platform == "win32"',
 ]
 
 [tool.pytest.ini_options]
 addopts = "--benchmark-skip --benchmark-warmup=on --benchmark-warmup-iterations=5 --benchmark-disable-gc --benchmark-name=short --benchmark-sort=mean --benchmark-group-by=fullfunc --benchmark-storage=.benchmarks-kivy --benchmark-save=kivy"
 markers = "incremental: mark a test as incremental."

 ]
```

```diff:kivy\setup.cfgファイル
@@ -24,64 +24,64 @@ concurrency = thread, multiprocessing
 python_requires = >=3.6
 install_requires =
     Kivy-Garden>=0.1.4
     docutils
     pygments
-    kivy_deps.angle~=0.3.0; sys_platform == "win32"
-    kivy_deps.sdl2~=0.3.1; sys_platform == "win32"
-    kivy_deps.glew~=0.3.0; sys_platform == "win32"
+    kivy_deps.angle; sys_platform == "win32"
+    kivy_deps.sdl2; sys_platform == "win32"
+    kivy_deps.glew; sys_platform == "win32"
     pypiwin32; sys_platform == "win32"
 dependency_links = https://github.com/kivy-garden/garden/archive/master.zip
 
 [options.extras_require]
 tuio = oscpy
 dev =
     pytest>=3.6
     pytest-cov
-    pytest_asyncio!=0.11.0
+    pytest_asyncio
     pytest-timeout
     pytest-benchmark
     pyinstaller
     sphinx
     sphinxcontrib-blockdiag
     sphinxcontrib-seqdiag
     sphinxcontrib-actdiag
     sphinxcontrib-nwdiag
-    kivy_deps.gstreamer_dev~=0.3.1; sys_platform == "win32"
-    kivy_deps.sdl2_dev~=0.3.1; sys_platform == "win32"
-    kivy_deps.glew_dev~=0.3.0; sys_platform == "win32"
+    kivy_deps.gstreamer_dev; sys_platform == "win32"
+    kivy_deps.sdl2_dev; sys_platform == "win32"
+    kivy_deps.glew_dev; sys_platform == "win32"
     flake8
     pre-commit
 base =
     pillow
     docutils
     pygments
-    kivy_deps.angle~=0.3.0; sys_platform == "win32"
-    kivy_deps.sdl2~=0.3.1; sys_platform == "win32"
-    kivy_deps.glew~=0.3.0; sys_platform == "win32"
+    kivy_deps.angle; sys_platform == "win32"
+    kivy_deps.sdl2; sys_platform == "win32"
+    kivy_deps.glew; sys_platform == "win32"
     pypiwin32; sys_platform == "win32"
 media =
-    kivy_deps.gstreamer~=0.3.1; sys_platform == "win32"
+    kivy_deps.gstreamer; sys_platform == "win32"
     ffpyplayer; sys_platform == "linux" or sys_platform == "darwin"
 full =
     pillow
     docutils
     pygments
-    kivy_deps.gstreamer~=0.3.1; sys_platform == "win32"
-    kivy_deps.angle~=0.3.0; sys_platform == "win32"
-    kivy_deps.sdl2~=0.3.1; sys_platform == "win32"
-    kivy_deps.glew~=0.3.0; sys_platform == "win32"
+    kivy_deps.gstreamer; sys_platform == "win32"
+    kivy_deps.angle; sys_platform == "win32"
+    kivy_deps.sdl2; sys_platform == "win32"
+    kivy_deps.glew; sys_platform == "win32"
     ffpyplayer; sys_platform == "linux" or sys_platform == "darwin"
     pypiwin32; sys_platform == "win32"
 gstreamer =
-    kivy_deps.gstreamer~=0.3.1; sys_platform == "win32"
+    kivy_deps.gstreamer; sys_platform == "win32"
 angle =
-    kivy_deps.angle~=0.3.0; sys_platform == "win32"
+    kivy_deps.angle; sys_platform == "win32"
 sdl2 =
-    kivy_deps.sdl2~=0.3.1; sys_platform == "win32"
+    kivy_deps.sdl2; sys_platform == "win32"
 glew =
-    kivy_deps.glew~=0.3.0; sys_platform == "win32"
+    kivy_deps.glew; sys_platform == "win32"
 
 [flake8]
 ignore = E125,E126,E127,E128,E402,E741,E731,W503,F401,W504,F841,E722
 max-line-length = 80
 exclude = __pycache__,.tox,.git/,doc/,build/,.eggs/
```

## Visual Studio 2022 Build Toolsの設定
```
(venv_dir) > "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x64
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.11.8
** Copyright (c) 2021 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'

```
x64でコンパイルできる環境を設定します。 
さらに次の環境変数を追加設定します。

```
set MSSdk=1
set DISTUTILS_USE_SDK=1
set LIB=%cd%\libs;%LIB%
set INCLUDE=%cd%\include;%INCLUDE%

set USE_SDL2=1
set USE_GSTREAMER=0
:: optionally
set USE_GSTREAMER=1
```


##仮想環境に依存関係を排除した状態でインストールします。

```console
(venv_dir) > python -m pip install -e kivy\.
```
pip install に-eをつけることで[development_mode](https://setuptools.pypa.io/en/latest/userguide/development_mode.html)でモジュールをインストールすることができます。
https://pip.pypa.io/en/stable/cli/pip_install/#

最終的には、こんな感じで kivy 2.x が導入できます。

```console
(venv_dir) > python -m pip install -U kivy_examples
(venv_dir) > pip list
Package                 Version    Editable project location
----------------------- ---------- ---------------------------------------
certifi                 2021.10.8
charset-normalizer      2.0.9
Cython                  0.29.26
docutils                0.18.1
idna                    3.3
Kivy                    2.1.0.dev0 c:\foo\bar\kivy
kivy-deps.angle         0.3.0
kivy-deps.glew          0.3.0
kivy-deps.glew-dev      0.3.0
kivy-deps.gstreamer     0.3.2
kivy-deps.gstreamer-dev 0.3.2
kivy-deps.sdl2          0.4.3
kivy-deps.sdl2-dev      0.4.3
Kivy-examples           1.11.1
Kivy-Garden             0.1.4
pip                     21.3.1
Pygments                2.11.0
pypiwin32               223
pywin32                 303
requests                2.26.0
setuptools              60.2.0
urllib3                 1.26.7
wheel                   0.37.1

(venv_dir) > pip list -o
```

##Kivy のデモンストレーションを起動してみます。
```console
(venv_dir) > SET KIVY_GL_BACKEND=angle_sdl2
(venv_dir) > python venv_dir\share\kivy-examples\demo\showcase\main.py
```

#test
https://pyky.github.io/kivy-doc-ja/contribute-unittest.html は環境が古い時の記載なので

[Python pytest](https://pypi.org/project/pytest/)と[Python nose2](https://pypi.org/project/nose2/)でテストを実行する。

```console
pip install nose2
pip install pytest
nose2 -v kivy
```
てテストを実行することができます。