Bienvenue sur IndexError.

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

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

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,690 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,674 points)
sélectionné 12-Nov-2015 par buffalo974
...