PyAutoGUIを使ったPythonアプリをexe化するまで

# Pythonアプリを、Python入っていないPCで動かすには
自作のPythonアプリをビルド（= exe化）して、Pythonが入っていないPCでも動かせるようにするための手段としては、Windowsの場合は、

1. PyInstaller
2. py2exe

のほぼ2択っぽい。
Macだとpy2exeは使えないが、py2appというライブラリが使えるらしい（未確認）。

PyInstallerはpy2exeに比べて手軽に扱えるが、exe実行時の起動の速さは、py2exeの方に軍配が上がる、との話。

で、PyAutoGUIを使ったPythonアプリをpy2exeでexe化を試みたところ、最終的には乗り越えたものの、私の環境ではいろいろと壁があったのでメモっておく。

# 当方の環境
- Windows10
- Python 3.7  
→ NGだったので3.4に切り替えて問題解消した

# setup.pyの作成
py2exeでは、setup.pyというファイルを用意する必要がある。
setup.pyには、ビルドのための設定を書く。

↓　こちらを大いに参考にさせていただいた。Python2ベースの記事だが、Python3でも参考になる。

py2exeでPythonのスクリプトを実行ファイル(exe)にする【py2exe】- ku-mu*様
http://cocodrips.hateblo.jp/entry/2015/06/03/232419

# Python3.7ではビルド時にエラー → Python3.4に乗り換える
しかし、Python3.7でまずビルドを試みるとエラー。

```
python .\setup.py py2exe
running py2exe
Traceback (most recent call last):
  File ".\setup.py", line 11, in <module>
...
  File "C:\Users\Chihiro\AppData\Local\Programs\Python\Python37\lib\distutils\core.py", line 148, in setup
    dist.run_commands()
...
  File "C:\Users\Chihiro\Techpit-Market\instagram-auto\lib\site-packages\py2exe\mf3.py", line 417, in _scan_opcodes
    yield "store", (names[oparg],)
IndexError: tuple index out of range
```


living-sun.comでのQAによると、
https://living-sun.com/ja/python/707242-compiling-python-script-to-exe-with-py2exe-getting-error-python-selenium-py2exe-helium.html

> 現在py2exeは3.4までのPythonをサポートしています

何ということでしょう……。
ということでPython3.4に切り替える。

# Windowsでは複数バージョンのPythonを共存できるらしい

なんと。寡聞にして存じ上げなかった。

Windows で複数バージョンの Python を使う@landwarrior様
https://qiita.com/landwarrior/items/1b5e0f9af5316a025fe0

Python3.4を入れた後、

    $ py -3.4 -m venv foo

で、3.4のvenv環境を作れる。

# しかし3.4上でPyAutoGUI入れられず → setuptoolsのバージョン上げて解消

```
pip install PyAutoGUI
Collecting PyAutoGUI
  Using cached 
...
    Complete output from command python setup.py egg_info:
    C:\Python34\lib\distutils\dist.py:260: UserWarning: Unknown distribution option: 'long_description_content_type'
      warnings.warn(msg)
    error in PyAutoGUI setup command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers; Expected version spec in pyobjc-core;platform_system=="Darwin" at ;platform_system=="Darwin"

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in C:\Users\Chihiro\AppData\Local\Temp\pip-build-6qgzk2sj\PyAutoGUI
...
```
zhgmen様より。
https://www.cnblogs.com/zhgmen/p/11205280.html

    pip install setuptools -U

でこれも解消。

# しかし今度はPillowが入らず → pipのバージョン上げて解消

さすがにそろそろくじけそうになるが、

```
Collecting Pillow (from PyAutoGUI)
  Downloading 
...
    C:\Users\Chihiro\AppData\Local\Temp\pip-build-95awba34\Pillow\setup.py:12: PkgResourcesDeprecationWarning: Parameters to load are deprecated.  Call .resolve and .require separately.
      import os
    Traceback (most recent call last):
      File "<string>", line 20, in <module>
...
      File "C:\Users\Chihiro\AppData\Local\Temp\pip-build-95awba34\Pillow\setup.py", line 324, in finalize_options
        if sys.version_info.major >= 3 and not self.parallel:
      File "C:\Python34\lib\distutils\cmd.py", line 103, in __getattr__
        raise AttributeError(attr)
    AttributeError: parallel

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in C:\Users\Chihiro\AppData\Local\Temp\pip-build-95awba34\Pillow
```

ちょっとばかりふて寝した後、なんとなく、さっきはsetuptoolsのバージョン上げたら解消したんだから、今度はpipのバージョン上げたらどうかと考え、

    $ python -m pip install --upgrade pip

して、pipを19.2.1に上げたらなんと解消。

これでようやく目的を達成できた。

# 思ったこと

いつもいつも、ネットの皆様に助けられてばかりですね。
なんだかんだで、ホントに良い時代になったものです。