【未完】プログラム作ったけどターミナルから実行するのがめんどい……せや！D&Dで実行できるようにしたろ！【Python】

#環境
Windows10 64bit

#いきさつ
私はよくPythonでプログラムを書くのですが、作ったプログラムを利用するためにはターミナルからコマンドを打って実行しなければならないという手間を面倒に思っていました。

```
$ py hogehoge.py
```

もっと世のフリーソフトみたいに`.exe`形式にして、ドラッグ＆ドロップでパスも受け取れたりしちゃってみたいな魔法がどこかにないかなあ～～～～～～～～！！！！！！！！

**ありました**
[PyInstaller](https://www.pyinstaller.org/)

※本記事は途中までやりかけの内容で止まっています。気が向いたら続きをやります。

#インストールしてみよう
おなじみpipでインストール。しかしエラーが出ました。

```
$ pip install pyinstaller
Collecting pyinstaller
  Downloading https://files.pythonhosted.org/packages/03/32/0e0de593f129bf1d1e77eed562496d154ef4460fd5cecfd78612ef39a0cc/PyInstaller-3.4.tar.gz (3.5MB)
     |████████████████████████████████| 3.5MB 142kB/s
  Installing build dependencies ... done
  Getting requirements to build wheel ... error
ERROR: Complete output from command 'e:\pglang\python\python37\python.exe' 'e:\pglang\python\python37\lib\site-packages\pip\_vendor\pep517\_in_process.py' get_requires_for_build_wheel 'C:\Users\あつし\AppData\Local\Temp\tmp6wjtbx_n':
  ERROR: Error in sitecustomize; set PYTHONVERBOSE for traceback:
  SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0x82 in position 0: invalid start byte (sitecustomize.py, line 21)
  Traceback (most recent call last):
    File "e:\pglang\python\python37\lib\site-packages\pip\_vendor\pep517\_in_process.py", line 207, in <module>
      main()
    File "e:\pglang\python\python37\lib\site-packages\pip\_vendor\pep517\_in_process.py", line 197, in main
      json_out['return_val'] = hook(**hook_input['kwargs'])
    File "e:\pglang\python\python37\lib\site-packages\pip\_vendor\pep517\_in_process.py", line 48, in get_requires_for_build_wheel
      backend = _build_backend()
    File "e:\pglang\python\python37\lib\site-packages\pip\_vendor\pep517\_in_process.py", line 39, in _build_backend
      obj = getattr(obj, path_part)
  AttributeError: module 'setuptools.build_meta' has no attribute '__legacy__'
  ----------------------------------------
ERROR: Command "'e:\pglang\python\python37\python.exe' 'e:\pglang\python\python37\lib\site-packages\pip\_vendor\pep517\_in_process.py' get_requires_for_build_wheel 'C:\Users\あつし\AppData\Local\Temp\tmp6wjtbx_n'" failed with error code 1 in C:\Users\あつし\AppData\Local\Temp\pip-install-gp73z2z4\pyinstaller
```

こちらは`pip`のバージョンが19だと発生する模様。
[Installing pyinstaller gives an error message](https://stackoverflow.com/questions/54343455/installing-pyinstaller-gives-an-error-message)
実際にバージョンを確かめてみたら19でした。

```
$ pip --version
pip 19.1.1 from e:\pglang\python\python37\lib\site-packages\pip (python 3.7)
```

なのでpipをダウングレードします。

```
$ pip install pip==18.1 --user //permission errorが出たのでuserオプションを付けました
Collecting pip==18.1
  Using cached https://files.pythonhosted.org/packages/c2/d7/90f34cb0d83a6c5631cf71dfe64cc1054598c843a92b400e55675cc2ac37/pip-18.1-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 19.1.1
    Uninstalling pip-19.1.1:
      Successfully uninstalled pip-19.1.1
Successfully installed pip-18.1

$ pip --version
pip 18.1 from /home/anaaki/.local/lib/python2.7/site-packages/pip (python 2.7)
```

ちゃんとダウングレードできたみたいです。
これで再度PyInstallerをインストールしてみましょう。

```
$ pip install pyinstaller --user
Collecting pyinstaller
Collecting macholib>=1.8 (from pyinstaller)
  Using cached https://files.pythonhosted.org/packages/41/f1/6d23e1c79d68e41eb592338d90a33af813f98f2b04458aaf0b86908da2d8/macholib-1.11-py2.py3-none-any.whl
Collecting altgraph (from pyinstaller)
  Using cached https://files.pythonhosted.org/packages/0a/cc/646187eac4b797069e2e6b736f14cdef85dbe405c9bfc7803ef36e4f62ef/altgraph-0.16.1-py2.py3-none-any.whl
Collecting pefile>=2017.8.1 (from pyinstaller)
Collecting dis3 (from pyinstaller)
  Using cached https://files.pythonhosted.org/packages/9c/5c/4a4a2802f10f558018413990a58fd3dd7ed1eb48e6de7266334c2489bad6/dis3-0.1.3-py2-none-any.whl
Requirement already satisfied: setuptools in /usr/lib/python2.7/dist-packages (from pyinstaller) (39.0.1)
Collecting future (from pefile>=2017.8.1->pyinstaller)
Installing collected packages: altgraph, macholib, future, pefile, dis3, pyinstaller
Successfully installed altgraph-0.16.1 dis3-0.1.3 future-0.17.1 macholib-1.11 pefile-2019.4.18 pyinstaller-3.4

$ pyinstaller --version
3.4
```

上手くいきました。よかったよかった。
`pip`はもう戻してもいいのかな？よくわからないから18のままにしておきます。

#使ってみよう
[前回](https://qiita.com/Anaakikutsushit/items/9ab57d6e57d0e133445c)作ったプログラムを`.exe`形式にして、ダブルクリックで実行できるようにしてみます。

使い方はめちゃくちゃ簡単。スクリプトのあるフォルダに移動して`pyinstaller hogehoge.py -w -F`を実行するだけ。
そのスクリプトの依存関係などを自動で解析したあとに実行ファイルを生成してくれます。
`-F`オプションは、出来上がったものを1ファイルにまとめるためのものです。

```
$ pyinstaller -F auto-convert-bmp-to-jpg.py
43 INFO: PyInstaller: 3.4
43 INFO: Python: 2.7.15rc1
43 INFO: Platform: Linux-4.4.0-17134-Microsoft-x86_64-with-Ubuntu-18.04-bionic
47 INFO: wrote /mnt/e/PgCode/Python/CaptureBoard/ConvertToJpg/auto-convert-bmp-to-jpg.spec
61 INFO: UPX is not available.
63 INFO: Extending PYTHONPATH with paths
['/mnt/e/PgCode/Python/CaptureBoard/ConvertToJpg',
 '/mnt/e/PgCode/Python/CaptureBoard/ConvertToJpg']
63 INFO: checking Analysis
79 INFO: checking PYZ
85 INFO: checking PKG
87 INFO: Bootloader /home/anaaki/.local/lib/python2.7/site-packages/PyInstaller/bootloader/Linux-64bit/run
88 INFO: checking EXE
90 INFO: Rebuilding EXE-00.toc because auto-convert-bmp-to-jpg missing
90 INFO: Building EXE from EXE-00.toc
94 INFO: Appending archive to ELF section in EXE /mnt/e/PgCode/Python/CaptureBoard/ConvertToJpg/dist/auto-convert-bmp-to-jpg
128 INFO: Building EXE from EXE-00.toc completed successfully.
```

生成物は`dist`フォルダ内に出てくるとのことなので確認してみましょう！
と思ったらアララ？
![07024cd091b5d7dcd9171957a4528040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/faeef64d-41a3-d55f-9503-1cad1ff55155.png)
`.exe`ファイルが出てくると思っていたのですが、そこにあるのは拡張子なしファイル。

手動で拡張子を付けて実行しようとしてみましたが、実行できませんでした。
![8a5e8143a195edb5c4d98ee4fc51aa90.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/c140a34a-58ad-ccc7-4a47-ceab035ff22a.png)
こんな表示初めて見ました。はぇ～。

うんうんうなっていたところ、Pythonのバージョンの方にも問題があるかもしれないという情報をキャッチ。
[【Windows10】【Python】pyinstallerを使うとき注意すべきこと](http://notwodaily.hatenablog.com/entry/2018/06/01/133337)
この記事では、Python3.6系でうまくいっているようですね。

改めてバージョンを確認してみると、python2.7系との表示。oh...
しかしPython3.6も入っているんです。`python`コマンドでデフォルトで呼び出すのを3.6に変えたら行けるとかなのでしょうか？

```
$ python --version
Python 2.7.15rc1

$ python3 --version
Python 3.6.7
```

しかしここから先に行くところでやる気が途絶えてしまったので中断。またいつか！