Для тех, у кого есть такая же проблема, и попробовал ответить @ Esa, вы можете заметить, что иногда это не работает, когда вы запускаете за пределами каталога. Это вызвано тем, что Pyinstaller все еще пытается найти относительный путь и вместо этого использовать не включенные файлы. Это может быть исправлено путем нахождения правильного пути внутри кода перед загрузкой файлов:
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
Это находит фактический путь к файлу и должно быть сделано для каждого файла, например:
pygame.image.load(os.path.join(Path, 'Path\\to_file\\from_root'))
sys._MEIPASS
является ключ, так как он найдет путь, когда программа будет заморожена, как при заморожении программы, файлы хранятся где-то в другом месте.
Когда вы создаете файл .exe, файл .spec также создается с корневым каталогом. В то вам необходимо будет изменить это следующим образом:
- Вы должны увидеть файловую структуру, аналогичную той, ниже
- Обратите внимание, как
datas
равно None
. Вам придется отредактировать это.
Это .spec файл в корневом каталоге в настоящее время:
# -*- 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')
Теперь, что мы делаем, мы добавляем все наши файлы: Поместите этот added_files
ниже block_cipher
но выше Analysis()
, например:
added_files = [
('file1.png', '.') #The '.' represents root folder
('file2.png', '\\folder') #loads file2.png from root\folder
]
В настоящее время внутри Analysis()
мы меняем None
после datas
на added_files
. Вы также заметите, что есть основные различные варианты для вашего окончательного файла. Вы можете редактировать их здесь, если хотите, но вы не можете изменить параметр «один файл», это делается при создании файла .spec.
Наконец, чтобы сделать этот новый исполняемый файл, перейдите в корневую папку в ЦМД и введите следующее:
pyinstaller "PY_FILE_NAME.spec"
Окончательный ехе, следует ли в папке или не быть в корне \ расст \ Executable_name.exe или root \ dist \ Executable_name \ Executable_name.exe
Вы получаете трассировку исключения в случае сбоя вашей программы? Трудно диагностировать проблему без какой-либо информации. Мое первое предположение заключалось в том, что 'img.png' не может быть загружен, потому что это не так, как ожидает ваша программа. – Blckknght
Все, что я получаю 'фатальная ошибка: main return -1'. Я попытался добавить 'img.png' в то же место, что и' .exe', но не работает. Из того, что вы сказали, я только сейчас понял, что, возможно, «img.png» должен быть в том же месте, что и PyInstaller ... проведет проверку EDIT: нет. –
Возможно, стоит добавить строку, чтобы распечатать текущий рабочий каталог. Таким образом, вы можете видеть, где именно приложение ищет файл. 'import os; print os.getcwd(); ' –