2016-04-18 4 views
1
img_l = pygame.image.load("img.png") 
screen.blit(img_l) 

С Python интерпретатора это работает отлично, изображение загружается и main.py работает без проблем, но когда я делаю это в один файл .exe с Pyinstaller, .exe аварий.Pygame.image.load() не работает с PyInstaller

Я пробовал несколько модификаций .spec, но немногие, с которыми мне удалось найти, похоже, не помогают.

Любые идеи, искренне оцененные.

EDIT: получил он работает с:

img_l = pygame.image.load(os.path.join('img.png')) 
screen.blit(img_l, (0, 0)) 

Сейчас он работает, как он должен, пройдя через PyInstaller :)

+1

Вы получаете трассировку исключения в случае сбоя вашей программы? Трудно диагностировать проблему без какой-либо информации. Мое первое предположение заключалось в том, что 'img.png' не может быть загружен, потому что это не так, как ожидает ваша программа. – Blckknght

+0

Все, что я получаю 'фатальная ошибка: main return -1'. Я попытался добавить 'img.png' в то же место, что и' .exe', но не работает. Из того, что вы сказали, я только сейчас понял, что, возможно, «img.png» должен быть в том же месте, что и PyInstaller ... проведет проверку EDIT: нет. –

+1

Возможно, стоит добавить строку, чтобы распечатать текущий рабочий каталог. Таким образом, вы можете видеть, где именно приложение ищет файл. 'import os; print os.getcwd(); ' –

ответ

0

получил это работает с:

img_l = pygame.image.load(os.path.join('img.png')) 
screen.blit(img_l, (0, 0)) 

Теперь это работает как следует после прохождения PyInstaller :)

1

Извините, я очень новичок в программировании. Я получаю подобное (то же самое?) Ошибку, когда я пытаюсь запустить мой .exe Он говорит:

pygame.error: Couldn't open walkr1.png 

Я попытался исправить, что вы использовали, но затем получил ошибку:

pygame.error: Can't seek in this data source 

Файлы изображений находятся в папке в папке с основным файлом .py. Я попытался переместить файлы в одну папку, но это не сработало. Я также попытался добавить файлы данных в файл .spec, но это, похоже, не работает ... Было интересно, можете ли вы помочь? Извините, я знаю, что это, наверное, все очень глупые вопросы.

0

Для тех, у кого есть такая же проблема, и попробовал ответить @ 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 также создается с корневым каталогом. В то вам необходимо будет изменить это следующим образом:

  1. Вы должны увидеть файловую структуру, аналогичную той, ниже
  2. Обратите внимание, как 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

Смежные вопросы