【自動化】Pythonコードをexeファイル化する

## Pythonコードはどうやって配布する？

Pythonで作ったプログラムを他の人にも使ってもらいたい場合、どうやって配布するかが悩ましいですね。

例えば、Anaconda(Jupyter Notebook)で職場の事務作業を自動化するプログラムを書いたとしましょう。
親切なあなたは、自分だけでなく周りの人にもぜひ使ってもらいたいと考えます。
ですが、職場にAnacondaがインストールされているとは限らないですし、みんながプログラムに詳しいわけでもありません。
**アナコンダ？なにそれ、蛇ですか？**みたいな人に「まずJupyter Notebookを起動して、ipynbファイルを選択して…」なんて説明しても首ををかしげられるのがオチです。

## Pythonはexe化すればワンクリック！

Pythonコードも**exeファイル(エクゼファイル)**に変換すれば、クリックするだけで実行することができます。
これなら、プログラムに詳しくない人でも簡単に実行できます。

ここではAnaconda(Juypter Notebook)で書いたPythonのプログラムをexeファイルにする方法を解説します。
大まかな流れは下記のとおりです。

###手順
1. pyinstallerをインストールする
2. .pyファイルを用意する
3. Anaconda Promptを開き.pyファイルのある場所に移動する
4. pyinstallerコマンドで.pyファイルをexeファイルにする
5. exeファイルを実行して動作確認する

##1. pyinstallerをインストールする

pythonコードをexeファイルにするにはいくつか方法がありますが、ここでは「pyinstaller」を使った方法をご紹介します。

pyinstallerは`pip install pyinstaller`でインストールできます。

Anacondaを使っている場合は【Anaconda Prompt】を開き、以下のコマンドを入力しましょう。

```:Anaconda&nbsp;Prompt
pip install pyinstaller
```

もしくは、Jupyter Notebookのセルに

```python:Jupyter&nbsp;Notebook
!pip install pyinstaller
```

と入力して実行してもいいです。

##2. .pyファイルを用意する
無事pyinstallerがインストールできたら、次はexeファイル化したいコードを「.pyファイル」にしておきます。

Jupyter Notebookの場合、そのままでは**ipynb**というファイル形式になっているので、これをpyファイルに変換する必要があります。


Jupyter Notebookのメニューから「File - Download as」でPython(.py)を選択して保存しましょう。

![jupyter_pyfile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/68868ce0-60b1-17ff-49d7-5ab2bd01de6b.png)


##3. Anaconda Promptを開き.pyファイルのある場所に移動する

【Anaconda Prompt】を起動します。
そして、cdコマンドで先ほど保存したpyファイルがある場所に移動します。
例えば、pyファイルがある場所が「C:\Users\konitech\sample」なら、下記のようにコマンドを打ちます。

```:Anaconda&nbsp;Prompt
cd C:\Users\konitech\sample
```

##4. pyinstallerコマンドで.pyファイルをexeファイルにする

そして、pyinstallerコマンドでexeファイルを作ります。
例えば、test.pyをexeファイルにしたいなら、下記のようにコマンドを打ちます。

```:Anaconda&nbsp;Prompt
pyinstaller test.py --onefile
```

--onefileというオプションがないと、いくつもファイルができてごちゃごちゃしていますので、exeファイル一本にまとめるためこの--onefileを指定しています。

###エラーになってしまう場合
ここでエラーになってしまってうまくいかない場合もあります。

私が実際にエラーになったパターンと対処法をご紹介します。

■ **RecursionError: maximum recursion depth exceeded while calling a Python objectというエラー**

再帰回数が多すぎる的な内容のようですが、よくわかりません。
調べてみると`pyinstaller test.py --onefile`を実行したときに作られる【test.specファイル】を少し修正すればいいことがわかりました。

test.pyと同じフォルダにtest.specファイルというものが作られていると思いますので、これをテキストエディタで開きます。

```
# -*- mode: python -*-
```

のすぐ下に下記を挿入して、上書き保存します。

```
import sys
sys.setrecursionlimit(5000)
```

そして、

```:Anaconda&nbsp;Prompt
pyinstaller test.spec
```

と先ほど編集したspecファイルを指定して、exeファイルを作成します。


■ **Failed to execute script pyi_rth_pkgresというエラー**

pyi_rth_pkgresというのが実行できない的なことを書いてありますが、やはりよくわかりません。
このときもやはりspecファイルを修正します。

specファイルに

```:specファイル
a = Analysis(['test.py'],
             pathex=['C:\\Users\\xxx'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
```
こんな箇所があると思います。ここのhiddenimportsにpkg_resources.py2_warnを書き加えます。


```:specファイル
a = Analysis(['test.py'],
             pathex=['C:\\Users\\xxx'],
             binaries=[],
             datas=[],
             hiddenimports=['pkg_resources.py2_warn'],
             hookspath=[],
```

そして、

```:Anaconda&nbsp;Prompt
pyinstaller test.spec
```

と先ほど編集したspecファイルを指定して、exeファイルを作成してみましょう。


##5. exeファイルを実行して動作確認する

無事作成が完了すると「dist」というフォルダができていて、その中にexeファイルが1つだけ入っていると思います。
これが完成したexeファイルです。

実行してきちんと動くことを確認してみましょう。

動いたら、このexeファイルを配布すればOKです。やったね！

## 参考

私の書いた他の自動化シリーズはこちらです。ご興味があればどうぞ！

【自動化】PythonでOutlookメールを送信する
https://qiita.com/konitech913/items/51867dbe24a2a4272bb6

【自動化】PythonでOutlookのメールを読み込む
https://qiita.com/konitech913/items/8a285522b0c118d5f905

【自動化】Pythonでメール(msgファイル)を読み込む
https://qiita.com/konitech913/items/fa0cf66aad27d16258c0