Pythonスキルの習得

PyInstallerの使い方をマスターする – PythonコードをEXE・APPに変換&トラブルシューティング –

PyInstallerの使い方をマスターする - PythonコードをEXE・APPに変換&トラブルシューティング -

こんにちは、Zero-Cheeseです。

Pythonでプログラムを完成させたら、次は何をしますか?

多くの人が、「他人に配布、もしくは公開!」だと思いますが、意外と簡単ではありません。

当たり前ですが、他人のPCにPythonがインストールしていないと、動かないからです。

本記事では、やっとの思いで作成したプログラムを、他人のPCできちんと動かすための、

  • 実行可能ファイルの作成方法を

徹底的に解説します。

はじめに

実行ファイル化することの重要性

繰り返しになりますが、PythonがインストールされていないPCでは、Pythonが動きません。

また、Pythonがインストールされていたとしても、使用した外部ライブラリ(例えばNumpyなど)が一つでも足りないと、エラーが発生してしまいます。

これらの問題を解決するために、実行ファイル化することは、極めて重要です。

PyInstallerは、Pythonスクリプトを、実行可能ファイルに変換するツール」です。

この記事では、

  • PyInstallerのメリット・デメリット を解説した後、
  • PyInstallerの基本的な使い方の解説、
  • サンプルプログラムを使って、実際の使い方を体験していただき
  • よく発生するトラブルシューティング対応

徹底的に、解説します。

PyInstallerのメリット・デメリット

PyInstallerと他のツール(cx_Freeze、py2exe、Py2appなど)を比較した場合の、メリット・デメリットをまとめました。

メリット

  • さまざまなOSに対応(Windows、Mac、Linux)
  • 使いやすい(コマンドラインから、簡単に実行ファイルの作成が可能。また、使用しているライブラリを自動検出し、実行ファイルに含めてくれる。)

デメリット (下記は他のツールでも、共通して発生)

  • ファイルサイズが、大きくなる可能性あり(Pythonインタプリタ、ライブラリを含むため)
  • 実行速度が遅くなる可能性あり(元のPythonスクリプトに対して)
  • セキュリティの懸念(逆コンパイルが可能)

PyInstallerのインストール方法

pipを使って、簡単にインストールすることができます。

pip install pyinstaller

PyInstallerの基本的な使い方

実行ファイル化する方法として、主に2種類のモードがあります。

  • 単一のファイルモード
  • ディレクトリモード

それぞれの方法を、ご紹介します。

実行ファイル形式は、各OSに適した形式で、生成されます。

  • Windows → EXEファイル
  • MAC → APPファイル
  • Linux → 拡張子のない、バイナリファイル

Windowsから、MAC用のAPPファイルは作れません。ご注意下さい。

コマンドラインからの操作方法をご紹介します。

(Pythonスクリプトから、実行ファイル化する方法もあります。)

単一のファイルモード

  • 一つの実行ファイルに、まとめるモードです。

Pythonスクリプトと、関連ファイル(画像、データファイルなど)が、一つの実行ファイルに、まとめられます。

コマンドは、以下の通りです。

pyinstaller --onefile <スクリプト名>.py

生成が成功すると

  • distディレクトリが作られ、その中に、実行ファイルが保存されます。

厳密には、下記もあわせて、生成されます。(次章で説明する、ディレクトリモードも同じ)

  • buildディレクトリの生成。実行可能ファイルを生成する過程で、一時的に使用するファイルが、格納
  • 〇〇.specファイルの生成。PyInstallerはこのファイルを使用して、実行可能ファイルを生成

ディレクトリモード

  • 一つのディレクトリにまとめるモードです。

このディレクトリには、実行ファイルと共に、必要なすべてのライブラリやデータファイルが、含まれます。

コマンドは、以下の通りです。

pyinstaller <スクリプト名>.py

その他、よく使用されるオプション

  • --windowed or -w: GUIアプリケーションの実行時、同時に表示される、コンソールウィンドウを消去。
  • --name=<名前>: 生成される実行ファイルやディレクトリ名を指定。
  • --icon=<アイコン>: 実行ファイルのアイコンを指定。
  • --distpath=<ディレクトリ名>: 出力ディレクトリのパスを指定。

使用例:

pyinstaller --onefile -w --icon=myicon.ico --name=MyApp <スクリプト名>.py

サンプルプロジェクトを通して、実際の使い方を、実感する

本章では、価格.comのサイトから価格を取得し、画面に出力するPythonプログラムを作成します。

手順:

  1. 必要なライブラリをインストール
  2. 価格.comのサイトをWebスクレイピングして、価格を取得する「Pythonコード」を作成
  3. PyInstallerを使用して、実行可能ファイルに変換
  4. 生成された実行可能ファイルを、実行

本章では、Webスクレイピングのため、「beautifulsoup4」を使用します。

「詳細な使い方をマスターしたい!」と思われた方、下記Udemy講座が「分かりやすかった」です!(みんなの評価も、高いです。)

icon
Pythonによるビジネスに役立つWebスクレイピング(BeautifulSoup・Selenium・Requests)

① 必要なライブラリをインストール

pipにて、インストールします。

pip install beautifulsoup4 
pip install pyinstaller 
pip install requests 

※ 見やすいように、各行に分けた書き方をしています。(1行で、実行してもOKです。)

② 価格.comのサイトをWebスクレイピングして、価格を取得する「Pythonコード」を作成

今回は、スクレイピングにて、「GPU Nvidia RTX4070」の値段とShop名を取得」しました。

具体的には、下記モデルです。(LED等で着飾らなく、信頼のあるASUSから出しているVENTUSが、筆者のお気に入りとなってきました。)

Webスクレイピングを行う際は、対象のウェブサイトの利用規約を確認し、違反しないよう注意が必要です。

Pythonコードのファイル名を、fetch_prices.pyとします。

「価格.com」のHTML構造が変わると、正常に動かない可能性があります。(2023年9月時点に作成)

以下、コード内容です。

import requests
from bs4 import BeautifulSoup

def fetch_prices_and_shops(url):
    response = requests.get(url)
    response.encoding = 'Shift_JIS'
    soup = BeautifulSoup(response.text, 'html.parser')
    rows = soup.select('#mainLeft > table > tr')
    data = []

    for i, row in enumerate(rows):
        if i < 2:  # Skip header rows
            continue

        price_selector = 'td.p-priceTable_col.p-priceTable_col-priceBG > div > p.p-PTPrice_price'
        shop_selector = 'td.p-priceTable_col.p-priceTable_col-shopInfo > div > div.p-PTShop_info > div.p-PTShopData > p.p-PTShopData_name > a'
        price = row.select_one(price_selector)
        shop = row.select_one(shop_selector)
        if price and shop:
            data.append([price.text, shop.text])
    return data

url = 'https://kakaku.com/item/K0001529517/'  # 価格.comのURL
data = fetch_prices_and_shops(url)
print(f'取得したデータ: {data}')

SHIFT_JIS であること、注意しましょう。

結果: 下記が表示されます。

取得したデータ: [['¥85,980', 'XPRICE'], ['¥85,980', 'OCNオンラインショップ(旧NTT-X)'], ['¥88,750', 'ドスパラ'], ['¥88,750', 'パソコン工房'], ['¥89,800', 'PCワンズ'], ['¥90,408', 'Qoo10 EVENT'], ['¥94,660', 'ヨドバシ.com'], ['¥94,660', 'e-zoa-lite.com'], ['¥94,660', 'e-zoa.com'], ['¥96,511', 'グッドウィル\n'], ['¥96,735', 'AcademicStore'], ['¥97,160', 'PREMOA\n'], ['¥97,160', '[Amazon] XPRICE\n'], ['¥99,800', 'Joshin'], ['¥99,800', 'TSUKUMO'], ['¥99,800', 'PCSHOPアーク'], ['¥99,800', 'ゲーミングPcan'], ['¥100,808', 'Amazon.co.jp'], ['¥102,080', 'e-tokka'], ['¥106,040', 'ゆたぷろ'], ['¥106,673', 'e-tokka GOLD'], ['¥128,508', 'アスクル法人向け']]

③ PyInstallerを使用して、実行可能ファイルに変換

上記のプログラムを、PyInstallerを使って、実行可能なファイルに変換します。

pyinstaller --onefile fetch_prices.py

④ 生成された実行可能ファイルを、実行する

PyInstallerが生成した「distディレクトリ」に移動し、生成された実行可能ファイルを実行します。

cd dist
./fetch_prices

PyInstallerを使った方法、イメージがついたでしょうか?

PyInstaller トラブルシューティング対応

この章では、PyInstallerでよく発生する問題と、その解決策について解説します。

よく発生する問題:

  1. ライブラリが見つからない
  2. 実行可能ファイルが動作しない
  3. ファイルサイズが、大きくなりすぎる

① ライブラリが見つからない

通常は、以下の状況で発生します。

  • ライブラリがインストールされていない。
  • 実行可能ファイル生成時に、ライブラリへのパスが正しくない。

ライブラリがインストールされていない場合

例:エラーメッセージがNo module named 'requests'の場合、requestsライブラリをインストールする。

pip install requests

ライブラリをインストールした後、実行可能ファイルを、再度生成する必要があります。

pyinstaller myscript.py

実行可能ファイル生成時に、ライブラリへのパスが正しくない

実行可能ファイル生成時、「コード中にimportされたライブラリが、PyInstallerによって見つけられない場合」に発生します。

解決策は、--pathオプションを使用して、ライブラリの検索パスを追加します。

pyinstaller --path /path/to/module myscript.py

② 実行可能ファイルが動作しない

PyInstallerで生成された実行可能ファイルを実行しても、何も起こらない、またはエラーメッセージが表示されることがあります。

ライブラリが見つからない場合(ImportError: No module named 〇〇)は、前章を参考にして下さい。

エラーメッセージが表示される場合、そのエラーに基づいて適切な対策を取ります。

エラーメッセージが表示されない場合、もしくは、はエラーメッセージから原因が特定できない場合、デバッグ情報を取得することが可能です。

pyinstaller --debug all myscript.py

③ ファイルサイズが大きくなりすぎる

PyInstallerは、生成された実行可能ファイルに、依存関係含め、すべての必要なライブラリを含めるため、ファイルサイズが非常に大きくなる可能性があります。

解決策は、以下の通りです。

  • Pythonの仮想環境を作成し、必要なライブラリだけをインストールする
  • 不要なモジュールを除外する
  • 実行可能ファイルの圧縮する

Pythonの仮想環境を作成し、必要なライブラリだけをインストールする

下記コマンドは、一例です。

仮想環境の作成

python -m venv myenv

仮想環境のアクティベート

# Windowsの場合
.\myenv\Scripts\activate

# Mac、Linuxの場合
source myenv/bin/activate

必要なライブラリのインストール

pip install requests beautifulsoup4

PyInstallerを使用して実行可能ファイルを生成する

pyinstaller myscript.py

不要なモジュールを除外する

不要なモジュールを除外するには、--exclude-moduleオプションを、使用します。

pyinstaller --exclude-module unwanted_module myscript.py

実行可能ファイルの圧縮する

UPX(Ultimate Packer for eXecutables)を使用すれば、ファイルサイズを縮小することが、可能です。

◆ UPXのインストール方法

Windows:

  • UPXの公式GitHubリリースページ から、Windows用の最新バージョンのUPXをDL
  • ZIPファイルを解凍し、upx.exeのPATHを通す or コマンドプロンプトからアクセス可能な場所に保存

Mac:

# Homebrew によるインストールが、簡単です
brew install upx

Linux:

# aptが使える、ディストリビューションの場合:
sudo apt install upx

◆ 実行可能ファイルの生成

例えば、WindowsでUPXをC:\path\to\upxに保存した場合

pyinstaller --upx-dir=C:\path\to\upx myscript.py

実行可能ファイルのサイズを小さくすることで、一部の機能やパフォーマンスに、影響を与える可能性があります。

さいごに

PyInstallerを使用して、Pythonスクリプトを実行可能ファイルに変換することは、多くの場合、非常に便利です。

この記事では、PyInstallerの使い方と、エラーの対処法に関して、詳しく解説しました。

この記事が、あなたの役に立つことができれば、幸いです。

本記事も、最後までお付き合いいただき、ありがとうございました。

また、お会いしましょう!