Für alle anderen, die das gleiche Problem haben und die Antwort von @ Esa ausprobiert haben, stellen Sie möglicherweise fest, dass sie manchmal nicht funktioniert, wenn sie außerhalb des Verzeichnisses ausgeführt wird. Dies wird dadurch verursacht, dass Pyinstaller immer noch versucht, den relativen Pfad zu finden und stattdessen die enthaltenen Dateien verwendet. Dies kann durch die Suche nach dem richtigen Pfad in Ihrem Code vor dem Laden von Dateien festgelegt werden:
if getattr(sys, 'frozen', False):
Path = sys._MEIPASS #This is for when the program is frozen
else:
Path = os.path.dirname(__file__) #This is when the program normally runs
Dieser den tatsächlichen Pfad der Datei findet und muss für jede Datei durchgeführt werden, zum Beispiel:
pygame.image.load(os.path.join(Path, 'Path\\to_file\\from_root'))
sys._MEIPASS
ist der Schlüssel, da er den Pfad findet, wenn das Programm eingefroren ist, wie wenn ein Programm eingefroren ist, seine Dateien werden woanders gespeichert.
Wenn Sie die .exe-Datei generieren, wird auch eine .spec-Datei mit dem Stammverzeichnis erstellt. Dort müssen Sie diese wie folgt bearbeiten:
- Sie sollten eine Dateistruktur ähnlich dem unter
- Hinweis sehen, wie
datas
zu None
gleich ist. Sie müssen dies bearbeiten.
Dies ist die .spec-Datei im Stammverzeichnis zur Zeit:
# -*- mode: python -*-
block_cipher = None
#you will have to add things here later
a = Analysis(['file.py'],
pathex=['C:\\path\\to\\root\\folder'],
binaries=None,
datas=None,
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='game_file',
debug=False,
strip=False,
upx=True,
console=True , icon='icon_file.ico')
Nun, was wir tun, ist, dass wir alle unsere Dateien hinzufügen: diese added_files
unter block_cipher
Place, aber oberhalb Analysis()
, zB:
added_files = [
('file1.png', '.') #The '.' represents root folder
('file2.png', '\\folder') #loads file2.png from root\folder
]
Jetzt innerhalb von Analysis()
ändern wir die None
nach datas
zu added_files
. Sie werden auch bemerken, dass es die wichtigsten Optionen für Ihre endgültige Datei gibt. Sie können diese hier bearbeiten, wenn Sie möchten, aber Sie können die "Einzeldatei" -Option nicht ändern, dies wird gemacht, wenn die .spec-Datei erstellt wird.
schließlich diese neue EXE-Datei zu machen, gehen Sie zu Ihrem Stammordner in cmd und geben Sie diese:
pyinstaller "PY_FILE_NAME.spec"
Den letzten exe, ob in einem Ordner oder nicht in root \ dist \ Executable_name.exe sein sollte oder root \ dist \ Executable_name \ Executable_name.exe
Erhalten Sie einen Ausnahme-Traceback, wenn Ihr Programm abstürzt? Es ist schwierig, ein Problem ohne Informationen zu diagnostizieren. Meine erste Vermutung wäre, dass 'img.png' nicht geladen werden kann, weil es nicht an dem Ort ist, an dem Ihr Programm es erwartet. – Blckknght
Alles, was ich bekomme 'fataler Fehler: Main zurückgegeben -1'. Ich habe versucht, 'img.png' an derselben Stelle wie' .exe' hinzuzufügen, funktioniert nicht. Von dem, was du gesagt hast, habe ich gerade die Idee bekommen, dass 'img.png' an der gleichen Stelle wie PyInstaller sein muss ... werde EDIT testen: nein. –
Es könnte sich lohnen, eine Zeile hinzuzufügen, um das aktuelle Arbeitsverzeichnis auszudrucken. Auf diese Weise können Sie genau sehen, wo die Anwendung nach der Datei sucht. 'import os; print os.getcwd(); ' –