Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

CX_freeze et les polices Pygame: Fatal error...freesansbold.ttf

+4 votes

J'ai essayé de cx_freezer un micro-jeu dispo ici: http://inventwithpython.com/pygcurse/demo_dodger.py
L' intérêt est d'obtenir une "console" cross-plateforme sympathique.
Avec un petit projet comme ça, je ne prenais pas grand risque...pensais-je.

J'obtiens le message :

Fatal Python Error : (pygame parachute) Segmentation Fault file
C:\Anaconda\lib\site-packages\pygame\pkgdata.py line 67 in
getRessource

return open(os.path.normpath(path),'rb') FileNotFoundError : [Errno 2]
No such file or directory...
build\exe.win32-3.4\library.zip\pygame\freesansbold.ttf

Je me suis dis :
1- tiens on va changer return open par open read dans le fichier pkgdata.py,
2- j'ai aussi essayer de copier le freesansbold.ttf dans le répertoire library.zip de mon build,
3-j'ai changé le font None par freesansbold.ttf, pour ne pas le laisser perplexe face à la police par défaut
4- j'ai parcouru pleins de forum et la doc,
rien à faire ...

voici mon setup.py pour lancer la compil:

#!/usr/bin/python3
# -*- coding: utf-8 -*-


import sys, os
from cx_Freeze import setup, Executable

#############################################################################
# preparation des options

# chemins de recherche des modules
# ajouter d'autres chemins (absolus) si necessaire: sys.path + ["chemin1", "chemin2"]
path = sys.path

# options d'inclusion/exclusion des modules
includefiles = []
includefiles=["freesansbold.ttf"]
includes = []  # nommer les modules non trouves par cx_freeze
excludes = []
packages = ["pygame","pygcurse","zipfile"]  # nommer les packages utilises

# copier les fichiers non-Python et/ou repertoires et leur contenu:
includefiles = []

if sys.platform == "win32":
    pass
    # includefiles += [...] : ajouter les recopies specifiques à Windows
elif sys.platform == "linux2":
    pass
    # includefiles += [...] : ajouter les recopies specifiques à Linux
else:
    pass
    # includefiles += [...] : cas du Mac OSX non traite ici

# pour que les bibliotheques binaires de /usr/lib soient recopiees aussi sous Linux
binpathincludes = []
if sys.platform == "linux2":
    binpathincludes += ["/usr/lib"]

# niveau d'optimisation pour la compilation en bytecodes
optimize = 0

# si True, n'affiche que les warning et les erreurs pendant le traitement cx_freeze
silent = True

# construction du dictionnaire des options
options = {"path": path,
           "includes": includes,
           "excludes": excludes,
           "packages": packages,
           "include_files": includefiles,
           "bin_path_includes": binpathincludes,
           "create_shared_zip": False,  # <= ne pas generer de fichier zip
           "include_in_shared_zip": False,  # <= ne pas generer de fichier zip
           "compressed": False,  # <= ne pas generer de fichier zip
           "optimize": optimize,
           "silent": silent
           }

# pour inclure sous Windows les dll system de Windows necessaires
if sys.platform == "win32":
    options["include_msvcr"] = True

#############################################################################
# preparation des cibles
base = None
if sys.platform == "win32":
    base = "Win32GUI"  # pour application graphique sous Windows
    # base = "Console" # pour application en console sous Windows

icone = None
if sys.platform == "win32":
    icone = "icone.ico"

cible_1 = Executable(
    script="dodger.py",
    base=base,
    compress=False,  # <= ne pas generer de fichier zip
    copyDependentFiles=True,
    appendScriptToExe=True,
    appendScriptToLibrary=False,  # <= ne pas generer de fichier zip
    # icon=icone
    )

#############################################################################
# creation du setup
setup(
    name="monprogramme",
    version="1.00",
    description="monprogramme",
    author="auteurduprogramme",
    options={"build_exe": {"packages":packages}},




    executables = [Executable("dodger.py")]

    )

Python 3.4.3 |Anaconda 2.2.0 (32-bit)| (default, Mar 6 2015, 12:08:17) [MSC v.1600 32 bit (Intel)] on win32

demandé 19-Jun-2015 par buffalo974 (2,956 points)

1 Réponse

+5 votes
 
Meilleure réponse

Il faut utiliser le parametre zip_includes, qui permettra d'inclure ton fichier en tant que resources dans un fichier library.zip.

zip_includes prend une liste de strings ou une liste de couple [source, destination] (avec destination l'emplacement du fichier dans le zip),

Ca donnerait

"zip_includes":[
    ["path/to/freesansbold.ttf", "pygame/freesansbold.ttf"]
]

Et du coup, il te fauda reactiver la generation create_shared_zip si ce parametre concerne bien library.zip (pas trouvé dans la doc)

répondu 12-Nov-2015 par jc (2,704 points)
sélectionné 12-Nov-2015 par buffalo974
...