Maison >développement back-end >Tutoriel Python >Comment puis-je regrouper avec succès des fichiers de données avec l'option --onefile de PyInstaller ?

Comment puis-je regrouper avec succès des fichiers de données avec l'option --onefile de PyInstaller ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-23 03:24:13997parcourir

How Can I Successfully Bundle Data Files with PyInstaller's --onefile Option?

Regroupement de fichiers de données avec PyInstaller : résolution des problèmes avec --onefile

PyInstaller est un outil puissant pour créer des exécutables autonomes à partir de scripts Python. Lors du regroupement de fichiers de données, tels que des images ou des icônes, avec l'option --onefile de PyInstaller, les utilisateurs peuvent rencontrer des problèmes si les fichiers référencés ne sont pas localisés.

Comprendre la fonctionnalité --onefile

L'option --onefile combine tous les fichiers programme, bibliothèques et données en un seul fichier exécutable. Cela peut être bénéfique à des fins de distribution et de sécurité, mais nécessite des modifications dans la façon dont les fichiers de données sont accessibles.

Gestion des fichiers de données

Initialement, le fichier de spécifications contient le code suivant pour spécifier les fichiers de données :

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

Cependant, avec --onefile, PyInstaller ne stocke plus les fichiers de données dans des répertoires spécifiques. Au lieu de cela, il les intègre dans l'exécutable lui-même.

Résolution des problèmes de recherche de fichiers

Pour résoudre le problème où les fichiers de données ne peuvent pas être localisés par l'EXE compilé, une solution de contournement connue impliquait de définir une variable d'environnement à l'aide du module atexit, comme suggéré par Shish. Cependant, les versions plus récentes de PyInstaller ont supprimé cette fonctionnalité.

Solution mise à jour

Pour les versions actuelles de PyInstaller, la solution réside dans l'accès aux fichiers de données via sys._MEIPASS. L'extrait de code suivant illustre cette approche :

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)

En remplaçant les chemins de fichiers dans le fichier de spécifications par des appels à resource_path(), les fichiers de données peuvent être localisés et utilisés correctement dans l'exécutable --onefile.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn