Pygame nicht laden von png nach .exe-Datei mit Pyinstaller
Ich versucht habe zu machen .exe von meinem .py-Spiel, und es ist schon echt frustrierend.
Ich bin mit Python 3.5.2, Pygame 1.9.2 und Pyinstaller 3.2.
Läuft das Spiel perfekt .py, aber nachdem ich enter pyinstaller --debug game.py
, die .exe aufgebaut ist und wie ich es laufen lasse, bekomme ich die folgende:
Diese sind in den code-Zeilen aus game.py das kann im Zusammenhang mit der Fehlermeldung:
from os import path
img_dir = path.join(path.dirname(__file__), 'sprites')
title_screen = pygame.image.load(path.join(img_dir, 'title_screen.png'))
Ich denke, es muss etwas zu tun mit pyinstaler nicht in der Lage, um meine sprites-Ordner, weil wenn ich versuche zu laufen pyinstaller --icon=/sprites/icon.ico game.py
, bekomme ich diese:
Aber wenn ich pyinstaller --icon=icon.ico game.py
es lädt kurz das icon in Ordnung.
Hier meine spec-Datei:
# -*- mode: python -*-
block_cipher = None
added_files = [
( '/sprites', 'sprites' ),
( '/music', 'music' ),
( 'Heavitas.ttf', '.'),
( 'Roboto-Light.ttf', '.'),
( 'high scores.csv', '.')
]
a = Analysis(['spec_file.py'],
pathex=['C:\\Users\\rodri\\Documents\\Code\\The Color That Fell From The Sky'],
binaries=None,
datas=added_files,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='spec_file',
debug=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='spec_file')
- Sie könnte konvertieren Sie alle Ressourcen, um base64-strings (vielleicht komprimieren ersten), diese in das Skript und schreiben/erstellen der Dateien bei Ausführung
InformationsquelleAutor Rodrigo Nascimento | 2016-12-17
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es endlich geschafft!
Hier ist eine kurze Anleitung, was ich gemacht habe, falls Sie das hier Lesen, weil Sie ein ähnliches problem. (Ich habe Python 3.5.2, Pygame 1.9.2 und Pyinstaller 3.2)
Bereiten Sie Ihren code
Wie C._ erklärt auf die anderen Antworten (vielen Dank), in Fall, dass Sie laden Sie Dateien wie dieses:
Tun Sie dies:
Ist es notwendig, weil, wenn Sie einfrieren, Ihre code, die Dateien sind gonna be in einen anderen Ordner verschoben, als die, die Sie verwendet haben, bevor. Stellen Sie sicher, Sie tun dies, um alle Dateien.
Hier ein weiteres Beispiel:
- Symbol (optional)
Wenn Sie möchten, dass ein Symbol, das nicht pyinstaller ist Standard, können Sie wählen Sie ein png-Bild und wandeln Sie es um .ico mithilfe einigen online-converter (Google es). Danach setzen die .ico-Datei auf den gleichen Ordner, wo Ihre .py-Datei ist.
Machen die spec-Datei
Zu diesem Zeitpunkt sollten Sie wissen, wenn Sie möchten, eine einzelne, selbst enthalten .exe-Datei oder eine Reihe von separaten Dateien, die Sie zip und senden Sie es an Menschen. In jedem Fall, öffnen Sie das terminal auf den Ordner, wo Ihre .py-Datei ist.
Wenn Sie eine einzige Datei, verwenden Sie diese:
Wenn Sie nicht, verwenden Sie diese:
Wenn Sie nicht möchten, legen Sie das Symbol nun einfach nicht mit dem
--icon
Teil. Sie können es später ändern. Was können Sie später nicht mehr ändern, ist --onefile option (zumindest soweit ich weiß).Einer Datei mit dem Namen game_file.Skillung erstellt werden. Es wird automatisch der name aus game_file.py. Sie können es Durcheinander, wenn Sie unterschiedliche Namen haben, also nicht kreativ sein, jetzt. Wenn Sie sich für eine einzelne Datei, es sollte wie folgt Aussehen:
Wenn Sie sich entschieden haben, um eine Reihe von Dateien, Sie werden sehen, dass dieser zusätzliche Teil:
Nach
block_cipher = None
Sie sind gonna fügen Sie die Dateien, die Ihr Spiel geladen. Wie diese:Nun müssen Sie hinzufügen 'added_files' hier:
Können Sie auch einige Einstellungen ändern:
Wenn Sie nicht ändern Sie den Pfad oder die Ausgabe name der exe, wie ich sagte, dass Sie nicht auf die Kommentare, die wir nur brauchen, um Sie auszuführen und die .exe-Datei, die zuvor erstellt wurde, werden aktualisiert. Geben Sie diese über den Befehl Fenster:
Denken Sie daran, dass
game_file.spec
ist die Datei, die wir gerade bearbeitet haben und 'game_file' ist ein zufälliger name, den ich als Beispiel verwendet. Beachten Sie auch, dass es keine--some_option
weil Sie sich nicht die Arbeit mit der spec-Datei. Dies ist, warum Sie haben, um die änderungen direkt in das Skript.--onefile
auch hier nicht funktioniert und nicht aus dem Skript, das ist, warum ich sagte Ihnen, es zu tun, bevor.Werden Sie se, dass zwei Ordner erstellt wurden, auf dem gleichen Ordner, wo Sie .spec-Datei ist. Das nannte man 'Dist' enthält die exe-Datei und wenn Sie nicht
--onefile
es sollten auch noch ein paar andere Dateien, die Sie brauchen, um zip-zusammen mit der exe-teilen Sie die Anwendung mit anderen Menschen. Es wird auch eine 'Körperbau' - Ordner, aber ich weiß nicht, was es ist, da Sie es nicht brauchen, um die Anwendung zu verwenden.So, das ist es. Es sollte für Sie arbeiten.
Meine Fehler, wenn ich aus der Frage war, dass ich wusste nicht, dass der
sys._MEIPASS
Teil (nochmals vielen Dank C._), den Namen meiner spec-Datei war anders als meine py-Datei, die ich verwendet'/sprites'
statt'sprites'
imadded_files
und wusste nicht, ich war laufen soll, die spec-Datei anstelle der py-Datei.Weitere Informationen auf Pyinstaller, werfen Sie einen Blick auf die Handbuch, aber da ist es weit von gut und manchmal irreführend, du bist besser dran mit Google.
Beim kompilieren mit PyInstaller, alle Dateien werden in ein anderes Verzeichnis verschoben, wenn Sie Ihren
exe
. Also, um zu diesem Ort zu erhalten, diese an den Anfang des Codes, bevor Sie generieren PfadeAlle Ihre Ordner-Pfade können dann generiert werden, von Ihrem Standort aus
Dann, wenn Sie haben die Position, die Sie ausführen, können Sie alle Ihre Dateien von dort aus :
Ich auch sehen, dass haben Sie andere Schriftarten/Zeug, Sie können das gleiche tun, um diese zu laden
Für das Symbol, fügen Sie einfach eine temporäre
icon.ico
in deinem main-Ordner und geben Siepyinstaller -i "icon.ico" "spec_file.spec"
Schließlich, als ich hatte das gleiche problem vor, ich empfehlen Sie, kompilieren Sie Ihre
exe
einfachpyinstaller "spec_file.spec"