Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
132
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

【自動化】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 Prompt
pip install pyinstaller

もしくは、Jupyter Notebookのセルに

Jupyter Notebook
!pip install pyinstaller

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

2. .pyファイルを用意する

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

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

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

jupyter_pyfile.png

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

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

Anaconda Prompt
cd C:\Users\konitech\sample

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

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

Anaconda 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 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 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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
132
Help us understand the problem. What are the problem?