PythonスクリプトをWindows環境で動作するEXEにする方法

# 初めに
GxPの島田（@tshimada-gxp）です。
本記事はグロースエクスパートナーズアドベントカレンダー2022の10日目の記事です。
この記事は、PythonスクリプトをWindows環境で動くEXEとしてコンパイルすることで簡単なツール的なものを作れることを紹介したいと思います。
# なぜおすすめしたか？
今回の内容は、Pythonの単なる導入案内になりますが、プログラム初心者の方でも、とてもとっつきやすいプログラミングだと思っています。
もちろん、端末（CLI）を使うので面倒って思う方もいるかもですが、プログラミングを気軽に始めたいならこれが良いと思うのでおすすめです。
または、LinuxだったらできるのにWindowsでは・・・と思っているのスクリプト使い（私のことです）とか、解析にエクセル使うことが多いけど、エクセルが無い環境もあって不便を感じているなんて人にもおすすめかなって思います。
すごく環境構築が簡単だし、簡単なコーディングなら難しくないので、まだ触ったことが無ければぜひ。
# やること
私が最初に作ったソフトウェア「ファイル比較EXE」を作ります。
## 導入
### pythonのインストール
1. インストール
URL：https://www.python.org/downloads/
ここが参考になりました。
https://www.python.jp/install/windows/install.html#33kuG0
*ここでは「パッケージのインストール」だけ参考*
1. 確認
インストールが終わったらコマンドプロンプトを開いて「python」と入力してパスが通っていることを確認する。
```
C:\Users\[User-name]>python
Python 3.11.0 (main, Oct 24 2022, 18:26:48) [MSC v.1933 64 bit (AMD64)] on win32
Type 
"help", "copyright", "credits" or "license" for more information.
>>> 
```
抜けるときは、「Ctrl+z」を押下してから「Enter」
### Windows開発環境
開発環境としては、VisualStudioCodeを用います。
1. VisualStudioCodeインストール
URL：https://azure.microsoft.com/ja-jp/products/visual-studio-code/
上記でダウンロードしてインストールします。
1. 日本語化
メニューから「View」→「Command Palette...」を選択し、
![00001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987954/93dfd718-136f-7dd5-661a-087eef5f06ac.png)
「configure Display Language」と入力し、
![00002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987954/eac099d0-9fca-b6cc-7e18-2b982ecf3e0b.png)
日本語を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987954/43b0f46e-7793-80f0-a29d-e51646821da4.png)
選択後、アプリを再起動を促されるので再起動します。
1. Pythonライブラリをインストール
①を選択して、検索に「python」と入力し、見つかった②「python」③「python Extenshon Pack」をインストールします。
![00010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987954/1b79109a-4cbc-0f75-501e-848c809a4253.png)

### pyinstaller のインストール
![VBC001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987954/fc61ff69-58df-b1af-8411-e60f845572af.png)
1. pyinstaller
pipコマンドでインストールします。
インストールコマンドは、VScodeの端末か、コマンドプロンプトで、以下コマンドを投入します。
```
pip install pyinstaller
```
2．ファイル作成
ファイルは、「ファイル」→「新しいファイル」→「Python ファイル」と選択すると新規ファイルを作成できます。
Windows上で動作するようにコンパイルするには、以下コマンドを実行します。
```pyinstaller sample.py --onefile```
スクリプトを書いたファイルを任意のところに保存し、実行します。
3. EXE作成 
VBcodeの端末、または、コマンドプロンプトで、保存したファイルのフォルダまで移動します。
（とりあえず、ドキュメント直下とします）
それからコンパイル。
```
cd Documents
pyinstaller sample.py --onefile
```
これで実行ファイルができているはず。（生成物は、distフォルダが出来ているので参照）
```
ls dist 
sample.exe
```
## ファイル比較EXE（単なるスクリプト）
以下のスクリプトをコンパイルするだけです。
このEXEは、第1引数に渡したファイル、第2引数で渡したディレクトリから探すという動作をします。
(cmp.py)
```
import filecmp
import os
import sys

def find_all_files(directory):
    for root, dirs, files in os.walk(directory):
        yield root
        for file in files:
            yield os.path.join(root, file)

#--- main ---
if len(sys.argv) == 3:
  src = sys.argv[1]
  find = 0
  target_dir = sys.argv[2]
  for file in find_all_files(target_dir):
    if filecmp.cmp(src, file):
      print("src={0}\tcmp={1}".format(src, file))
      find = 1
  if find == 0:
    print("src={0}\tcmp={1}".format(src, "none"))
else:
  # not suppert options.
  print('not supported - ')
  for arg in sys.argv:
    print(arg)
```
これをコンパイルするだけ。
```pyinstaller cmp.py --onefile```
たったこれだけで、目的のリストを作れたのでとても助かりました。
（実際は、この処理をbashでファイル数分回しましたが）
でも、ほんと初心者で、このままの設定では日本語のコメントを入れるとコンパイルエラーになっているとか課題はあります。
あと注意点があります。
`filecmp.cmp()`は第3引数があって、これをfalseするとバイナリ比較となります。
上記は指定していないのでtrueが指定されていて、os.stat() 署名 (ファイルの種類、サイズ、および変更時間) を比較するだけの浅い比較になってます。（完全な一致を確認したい比較の場合には気を付けましょう）
# やってみて思ったこと
私の経験的には、Linuxでの開発を長いことやっていて、ずっとC言語オンリーでした。
きっかけは、仕事での作業ですが、bashでは無理だなって思い、他を調べて出会いました。
実際あっさり目的のスクリプトができたので良い出会いでした。
私にとって、簡単なスクリプトを作るのを日常的にやっていたので、好みにピッタリはまりまして、Windowsでも使えるとあってはと、新しくプログラム言語を学ぶことを楽しんでます。
（Windowsでgrepとかtailを疑似ったものなどを使ってログ解析したりとか）
この良いところは、exeファイル化したら場合はどのWindows環境でも動作することです。インストール不要でレジストリの変更ないのも使いやすいと感じました。
個人的には、ニッチな需要に答えるツールが生まれるんじゃないかなって思ってます。
# 最後に
というわけで、AIで人気なpythonですが、単純な処理だけするスクリプトとしても、手軽に仕事で使うことができたシーンがあったため、共有させていただきました。
もし良かったら、WindowsでpythonEXE、使ってみてください。
# さらに一言
アドベントカレンダーってとても良い活動ですね。
この企画を3年続けた@aishimura-gxpさんはすごいなって素直に思いました。

ちなみに、私はクリスチャンですので、この「アドベント」とい言葉に特別な意味があります。
アドベントは、「待ち望む」という意味で、救い主イエス・キリストを待ち望む期間っていう意味なんです。
その救いは神様からのプレゼントなのでクリスマスプレゼントの文化ができたと思います。
そこからアドベントをもじって、日めくりでそれぞれの技術などを共有するプレゼントで与え合うってとても素敵なことだと思います。
この一人ひとりの共有が、自分では乗り越えられない困難を感じている人のヒントになってたりして、と考えるとすごいですよね。
私の共有も、誰かのプレゼントになっていたらうれしく思います。

では、皆さんが大切な人と共に、良いクリスマスを過ごせますように。
メリークリスマス！