[Python #12] .pyファイルを.exe実行ファイル化

皆さんこんにちは。pythonチームのH.Iです。

最近は案件で忙殺されてます。不具合と戦いながら圧倒的成長を遂げています。

さて、今回は表題の通り、Pythonファイル(.pyファイル)を実行可能ファイル(.exeファイル)に変換する方法を紹介していきたいと思います。

.exeファイルというWindowsを想定したもの言いをしていますが、MacでもLinuxでも同様のことをできます。

.exeファイルって何?

.exeファイルというのは、Windows上で使用できる実行可能ファイルのひとつです。

アプリケーションやゲームをインストールするときにダウンロードされるのを見たことはないでしょうか。

この実行可能ファイルはダブルクリックするだけで処理を実行できるものです。

実行ファイル化すると何がいいの?

.exeファイルにするとPython環境が整っていないWindowsのPCでもPythonで作ったプログラムを実行することができます。

なので、何かの自動化スクリプトなどの便利系ツールを作ったときに配布したりもできます。

環境

私が今回作業を行った環境は下記になります。

OS: Windows10 Pro
ターミナル: Git Bash
Python 3.8.12

Git BashはWindowsなどでもLinuxコマンドっぽく使えるツールです。
私はVisual Studio Code上の規定のターミナルにしています。
Windows上でLinuxコマンドを使うにはWSL2を使う方が良いのでしょうが、いつからか環境壊れているので使っていません。


後々出てくるコマンドがLinuxコマンドですがお許しください。Windowsコマンドは使いにくいのです。

流れ

おおまかな流れはこのような感じです。

  1. venv仮想環境の構築
  2. venv仮想環境内で各種パッケージをインストール
  3. .exeファイルに変換したい.pyファイルを用意
  4. PyInstallerを使って.pyファイルを.exeファイルに変換
  5. 使ってみる

具体的な作業

1. venv環境の構築

今回は「実行ファイル」という名前のディレクトリ内で作業を行っていきます。

下記コマンドで.venvという名前のvenv仮想環境を構築します。
venvについて知りたい方はページ下部の参考の所にリンクを貼っておいたのでそちらを参考にしてください。

以降では、ターミナル上で入力するコマンドの前に「$」を付けています。また、実行するディレクトリも上に添えておきます。

ディレクトリ:実行ファイル

$ python -m venv .venv
$ source .venv/Scripts/activte

一行目で.venvという仮想環境を作り、二行目で仮想環境に入っています。

仮想環境に入れると、「(.venv)」という表示が常に出てきます。
以降では、仮想環境に入っている状態で作業を行っていきます。

2. venv仮想環境内で各種パッケージをインストール

今回は標準ライブラリしか使わないのですが、とりあえずPyInstallerはインストールしておきましょう。

ディレクトリ:実行ファイル

(.venv)
$ pip install pyinstaller

3. .exeファイルに変換したい.pyファイルを用意

今回は、どんなプログラムを作るかというと簡単に言えば、「更新履歴が最新のファイルのファイル名と、実行ファイルの実行時の時刻をメモしていく」というものを作ります。

具体的には、

  • 「実行ファイル」ディレクトリの下に、「files」というディレクトリを作る。
  • そのディレクトリ内に適当なファイルを入れていく。
  • 実行ファイルを実行する。
  • output.txtに、files内の更新履歴が最新のファイルのファイル名が記述される。

こんな感じの特に意味はないプログラムです。

以下、コードです。

file_names.py

import datetime
import glob
import os

infile_paths = glob.glob('./files/*') ## ./filesディレクトリ内のすべてのファイル名を取得

latest_file = max(infile_paths, key=os.path.getctime) ## ./filesディレクトリ内で最後に追加されたファイル名を取得

now_time = datetime.datetime.now() ## 現在時刻の取得

save_file = './output.txt' ## 出力するファイル名

f = open(save_file,'a',encoding='utf8') ## output.txtに追記していく
content = f'{now_time.strftime("%Y-%m-%d %H:%M")}(JST) 追加 : {latest_file}\n'
f.write(content)
f.close()

4. PyInstallerを使って.pyファイルを.exeファイルに変換

.pyファイルが用意できたので変換していきます。

ディレクトリ:実行ファイル

$ python -m PyInstaller file_names.py --onefile --nocosole

「PyInstallerというモジュールを使って、file_names.pyというpythonファイルを変換していきますよ」というコマンドです。

後ろについてる二つのオプションについては、

  • onefile : ひとつのファイルにまとめる
  • noconsole : .exeファイルを実行したときにコマンドプロンプトが出てこないようにする

という目的があるのですが、おまじないだと思っておいてください。

これを実行すると、「実行ファイル」ディレクトリ以下にこんなディレクトリやファイルができます。

  • file_names.spec(ファイル)
  • dist(ディレクトリ)
  • build(ディレクトリ)

この「dist」ディレクトリ内に、「file_names.exe」という実行ファイルができています。

こいつをとりあえず「実行ファイル」ディレクトリまで引っ張ってきます。

ディレクトリ:実行ファイル

$ mv ./dist/file_names.exe .

「実行ファイル」ディレクトリ内は今こんな感じになっています。

図1. ディレクトリ内

5. 使ってみる

使ってみましょう。

「files」ディレクトリになんの意味もない「test.txt」というファイルを入れてみます。

「file_names.exe」をダブルクリックします。

こんな内容の「output.txt」が作成されます。

output.txt

2022-10-05 23:53(JST) 追加 : ./files\test.txt

今度は「files」ディレクトリに「TEST2.txt」というファイルを入れてみます。

「file_names.exe」をダブルクリックします。

すると、「output.txt」の中身はこうなります。

output.txt

2022-10-05 23:53(JST) 追加 : ./files\test.txt
2022-10-05 23:55(JST) 追加 : ./files\TEST2.txt

TEST2.txtが最後に更新されたので、追記されました!

おわりに

いかがだったでしょうか。

今回は意味もないすごく簡素なプログラムを使用しましたが、同じ要領で複雑なプログラムも簡単な実行ファイルに出来てしまいます。

RPAなどの自動化ツールとの相性もよいのではないかと思っています。

このようにファイナルアンサーではいろいろな技術に挑戦していますので、興味がある方はぜひエントリーしてください!

参考

venvでpythonの仮想環境を作る!アクティブ化など使い方まとめ

PyInstallerでPythonをexe化!ライブラリの比較、注意点も解説