1. ホーム
  2. python

[解決済み] PyInstallerでデータファイルをバンドルする(--onefile)

2022-05-09 04:17:34

質問

PyInstallerを使って、画像とアイコンを含む1ファイルのEXEをビルドしようとしています。私はどうしても、それが --onefile .

もし私が --onedir は、すべて非常にうまく動作します。 私が --onefile コンパイルしたEXEを実行すると)参照された追加ファイルが見つかりません。DLLや他のものはすべてうまく見つかりますが、2つの画像だけは見つかりません。

EXEを実行したときに生成されるtemp-dirを調べました( \Temp\_MEI95642\ 例えば、)そのファイルは確かにそこにあります。EXEをそのテンポラリディレクトリにドロップすると、ファイルが見つかります。非常に困惑しています。

これを .spec ファイル

a.datas += [('images/icon.ico', 'D:\\[workspace]\\App\\src\\images\\icon.ico',  'DATA'),
('images/loaderani.gif','D:\\[workspace]\\App\\src\\images\\loaderani.gif','DATA')]     

サブフォルダーに入れないというのも試しましたが、違いはありませんでした。

編集する PyInstallerのアップデートにより、新しい回答を正しいものとしてマークしました。

解決方法は?

新しいバージョンの PyInstaller は env という変数があるため、Shishの優れた 回答 は動作しません。これで、パスは sys._MEIPASS :

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)