Pyinstaller und externe Pfade

Wenn man eine one-file-Anwendung mit Pyinstaller erstellt, dann lassen sich auch externe Dateien einbinden. Dies ist sehr nützlich, wenn man Resourcen- oder Konfigurationsdateien in die gebündelte Python-Anwendung laden möchte. Damit diese Dateien sicher gefunden werden von der Anwendung, ist im jeweiligen Skript der aktuelle Pfad zuvor zu ermitteln. Hierzu wird ein Systemattribut abgefragt, in dem dieser Pfad hinterlegt ist, wenn die one-file-Anwendung verwendet wird.

Wenn eine gebündelte Anwendung startet, setzt der Bootloader das Attribut sys.frozen und speichert den absoluten Pfad zum Anwendungsordner in sys._MEIPASS. Bei einem one-folder-Bundle ist dies der Pfad zu genau diesem Ordner. Bei einem one-file-Bundle ist dies der Pfad zu dem vom Bootloader erstellten temporären Ordner.

Eine typische Verwendung wäre:

from pathlib import Path
import sys

if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
  bundle_dir = Path(sys._MEIPASS)
else:
  bundle_dir = Path(__file__).parent

path_to_file = Path.cwd() / bundle_dir / "other-file.dat"