Unde să puneți imagini în folderul python exe?

Am convertit un joc python pe care l-am proiectat într-un exe. Rularea exe în sine îl face să clipească și apoi să se închidă, ceea ce înseamnă că a apărut o eroare. Rularea acestuia din comanda de comandă cauzează și eroarea, dar îl documentează:

Cannot load image: Playfield.png
Couldn't open images\Playfield.png

Acest lucru îmi spune că blocul load_image nu reușește. Am întâlnit acest lucru înainte, când nu aveam un director images .

Am încercat să muiesc directorul images în directorul dist . Aceasta este eroarea care apare:

Traceback (most recent call last):
    File "Table_Wars.py", line 728, in 
    File "Table_Wars.py", line 51, in main
    File "Table_Wars.py", line 236, in __init__
    File "pygame\__init__.pyc", line 70, in __getattr__
NotImplementedError: font module not available
(ImportError: DLL load failed: The specified module could not be found.)

Aceasta este prima dată cu Py2exe, așa că nu sunt sigur ce se întâmplă. Fișierul brut python în sine, Table_Wars.py, rulează conform așteptărilor.

Dacă aceasta ajută, locația pentru întregul dosar Table_Wars se află într-un folder numit Jocuri, aflat pe desktop-ul meu (C: \ Users \ Oventoaster \ Desktop \ Games \ Table_Wars). Am rulat Windows 7 32 bit OS.

La cerere, aici este output.txt pe care l-am generat:

Folder PATH listing for volume OS
Volume serial number is 7659-4C9C
C:\USERS\OVENTOASTER\DESKTOP\GAMES\TABLE_WARS
build
   bdist.win32
       winexe
           bundle-2.7
           collect-2.7
              ctypes
              distutils
              email
                 mime
              encodings
              logging
              multiprocessing
                 dummy
              pygame
                 threads
              unittest
              xml
                  parsers
           temp
dist
images

Iată setarea setup.py pe care am folosit-o pentru a converti fișierul:

from distutils.core import setup
import py2exe

setup(console=['Table_Wars.py'])

EDIT: I have attempted to use the full py2exe example. This will create the exe, but gives the same Cannot load image error. Attempting to put the images folder in the same folder as the exe creates a Runtime Error: The application requested the runtime to terminate it in an unusual way.

Forma scurtată a codului Slace Diamond sugerat împiedică py2exe să găsească Table_Wars.py :

din cmd:

running py2exe
*** searching for required modules ***
error: Table_Wars.py: No such file or directory.

setup and Table_Wars are in the same directory. If it help, I input the full path to python.exe and setup.py.

EDIT: Se pare că mă apropii mai mult. Am pus directorul images în self.extra_datas , iar acum primesc acest lucru:

Fatal Python error: (segmentation fault) This application has requested the runtime to terminate it in an unusual way. Please contact the application's suppourt team for more information

0
Ai putea rula tree "C: \ Users \ Oventoaster \ Desktop \ Games \ Table_Wars"> output.txt si posta fisierul output.txt care apare? Acest lucru ne va da o idee mai bună despre locul unde sunt localizate fișierele.
adăugat autor Nick ODell, sursa
Problema este legată de directorul de lucru, unde începe executabilul? ruda ar trebui să se alinieze la directorul de lucru, pentru a fi rezolvate corect. Sau, dacă este posibil, încercați să concatenați calea completă a imaginii în program, atunci puteți vedea cum pe pământ calea nu este corect formată.
adăugat autor zinking, sursa
Cred că este doar o problemă cu fișierul de configurare py2exe. Puteți posta codul dvs. setup.py ?
adăugat autor jdi, sursa

2 răspunsuri

Când construiți un pachet distribuabil cu py2exe (și, de pildă, py2app), o parte din mediul de pachete trebuie să indice o locație de resurse locale pentru fișiere. În versiunea dvs. neambalată, vă referiți la o locație relativă "imagini /". Pentru versiunea ambalată, trebuie să configurați setup.py pentru a include resursele în propria locație.

Refer to this doc for very specific info about how to set the data_files option of your package: http://www.py2exe.org/index.cgi/data_files

Această pagină are mai multe exemple pentru a afișa atât căi foarte simple, cât și o funcție de ajutor pentru găsirea datelor și construirea listei data_files pentru dvs.

Iată un exemplu de fragment simplu:

from distutils.core import setup
import py2exe

Mydata_files = [('images', ['c:/path/to/image/image.png'])]

setup(
    console=['trypyglet.py.py']
    data_files = Mydata_files
    options={
                "py2exe":{
                        "unbuffered": True,
                        "optimize": 2,
                        "excludes": ["email"]
                }
        }
)

Acest lucru se potrivește exact cu ceea ce încercați să atingeți. Se spune că fișierul sursă "image.png" ar trebui să fie plasat în directorul "imagini" de la rădăcina locației resurselor din interiorul pachetului. Această rădăcină a resurselor va fi directorul dvs. curent din script-urile dvs. Python, astfel încât să puteți continua să o referiți la acesta ca pe un sub-director relativ.

0
adăugat
Acest lucru cauzează o eroare de sintaxă la data_files = MyData_files
adăugat autor Oventoaster, sursa
Care este eroarea de sintaxă specifică. Ar putea fi doar o problemă de indentare
adăugat autor jdi, sursa

Se pare că ați rezolvat deja problema imaginii prin mutarea dosarului în dist. Modulul de fonturi lipsă, pe de altă parte, este o problemă cunoscută între pygame și py2exe. Py2exe nu copiază unele DLL-uri necesare, deci trebuie să suprascrieți metoda isSystemDLL a lui py2exe, forțând-o să includă DLL-uri audio și fonturi.

Dacă Table_Wars.py este singurul modul din proiectul dvs., încercați să executați acest script cu python setup.py py2exe :

from os.path import basename
from distutils.core import setup

import py2exe

origIsSystemDLL = py2exe.build_exe.isSystemDLL
def isSystemDLL(pathname):
    if basename(pathname).lower() in ("libogg-0.dll", "sdl_ttf.dll"):
        return 0
    return origIsSystemDLL(pathname)
py2exe.build_exe.isSystemDLL = isSystemDLL

setup(windows=[{"script": "Table_Wars.py"}],
      options={"py2exe": {"dist_dir": "dist"}})

Puteți încerca, de asemenea, exemplu de fișier de configurare py2exe pe wiki-ul pygame. Dacă niciuna dintre ele nu funcționează, adăugați mesajele de eroare la întrebarea dvs.


Am încercat să rulez py2exe pe un proiect de probă și, de asemenea, mă rupe pentru mine când folosesc fontul implicit de tip pygame. Dacă utilizați fontul implicit, încercați să puneți un fișier ttf în rădăcina proiectului dvs. și, de asemenea, în dosarul dist. Va trebui să schimbați apelul la pygame.Font și în scriptul dvs.:

font = pygame.font.Font("SomeFont.ttf", 28)
0
adăugat
Am încercat fișierul de instalare completă py2exe, dar nu primesc această excepție: Traceback (apel cele mai recente Ultima): Fișier "C: \ Users \ Oventoaster \ Desktop \ Jocuri \ Table_Wars \ setup.py", linia 170,
adăugat autor Oventoaster, sursa
Am încercat sugestiile tale și s-au întâmplat următoarele: Când am adăugat doar blocul din răspuns, sa închis fără nici un motiv. Cealaltă sugestie a creat un exe, dar când am pus imaginile în folderul dist, am o eroare de execuție.
adăugat autor Oventoaster, sursa
După ce am făcut niște cercetări, cred că mașina pe care o folosesc este problema. Wiki afirmă că programul este pe 64 de biți. sistemul meu de operare este de 32 de biți.
adăugat autor Oventoaster, sursa
Ați încercat să adăugați doar codul postat înainte de a apela setup ? Nu cred că aveți nevoie de întregul fișier de instalare, tocmai am legat-o pentru a arăta că procedura este susținută de pygame, în ciuda faptului că a fost un hack al codului py2exe. Dacă doriți să utilizați fișierul de configurare complet, încercați să eliminați 'optimize: 2 , așa cum a sugerat o altă întrebare .
adăugat autor Devourant, sursa
Am adăugat un script la postarea mea, dați-mi voie să știu ce se întâmplă atunci când executați asta. În ceea ce privește exemplul wiki, puteți posta eroarea?
adăugat autor Devourant, sursa
Am actualizat postarea mea cu câteva informații despre specificarea unui ttf. Poate fi de ajutor dacă utilizați fontul implicit (adică treci None la pygame.font.Font ).
adăugat autor Devourant, sursa
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.