Значок настройки Pyinstaller с одним файлом не работает - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь сгенерировать однофайловый исполняемый файл с помощью Pyinstaller, и всегда происходит сбой, если я пытаюсь добавить значок, но когда я не прошу мой компьютер добавить значок, приложение успешно собирается. Я пытался следовать инструкциям на следующих страницах:

https://github.com/PySimpleGUI/PySimpleGUI/issues/445

https://shanetully.com/2013/08/cross-platform-deployment-of-python-applications-with-pyinstaller/

Значок настройки Pyinstaller

но никто из них не помог мне. Основываясь на странице за второй этих ссылок, я добавил следующие строки (последние, которые я добавил, поскольку использую Windows, но я не мог понять, что такое if sys.platform == 'win32' else a.binaries, (упомянуто на веб-сайте shanetully) должен сделать):

a.datas + [('images/ticon.ico', 'tfolder/images/ticon.ico', 'DATA')]
a.binaries + [('msvcp100.dll', 'C:\\Windows\\System32\\msvcp100.dll', 'BINARY'),
          ('msvcr100.dll', 'C:\\Windows\\System32\\msvcr100.dll', 'BINARY')]

в файл .spec и скопировал значок в tfolder/images.

Сообщение об ошибке, которое я получил (а также получал похожие или идентичные сообщения с предыдущими попытками), было следующим. (имя пользователя моего компьютера заменено на имя пользователя stackoverflow:

PS C:\Users\hilssu\Documents\pyinstaller_ij> pyinstaller.exe "C:\Users\hilssu\Documents\pyinstaller_ij\main.spec"
103 INFO: PyInstaller: 3.4
103 INFO: Python: 3.5.6
106 INFO: Platform: Windows-10-10.0.17134-SP0
109 INFO: UPX is not available.
112 INFO: Extending PYTHONPATH with paths
['C:\\Users\\hilssu\\Documents\\pyinstaller_ij',
 'C:\\Users\\hilssu\\Documents\\pyinstaller_ij']
114 INFO: checking Analysis
297 INFO: checking PYZ
364 INFO: checking PKG
446 INFO: Building because C:\Users\hilssu\Documents\pyinstaller_ij\build\main\main.exe.manifest changed
446 INFO: Building PKG (CArchive) PKG-00.pkg
156467 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
156523 INFO: Bootloader c:\program files\anaconda3\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe
156523 INFO: checking EXE
156525 INFO: Building EXE because EXE-00.toc is non existent
156530 INFO: Building EXE from EXE-00.toc
156537 INFO: SRCPATH [('images\\ticon.ico', None)]
156538 INFO: Updating icons from ['images\\ticon.ico'] to C:\Users\hilssu\AppData\Local\Temp\tmpzh0lbqym
Traceback (most recent call last):
  File "c:\program files\anaconda3\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\program files\anaconda3\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Program Files\Anaconda3\Scripts\pyinstaller.exe\__main__.py", line 9, in <module>
  File "c:\program files\anaconda3\lib\site-packages\PyInstaller\__main__.py", line 111, in run
    run_build(pyi_config, spec_file, **vars(args))
  File "c:\program files\anaconda3\lib\site-packages\PyInstaller\__main__.py", line 63, in run_build
    PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
  File "c:\program files\anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 838, in main
    build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
  File "c:\program files\anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 784, in build
    exec(text, spec_namespace)
  File "<string>", line 35, in <module>
  File "c:\program files\anaconda3\lib\site-packages\PyInstaller\building\api.py", line 433, in __init__
    self.__postinit__()
  File "c:\program files\anaconda3\lib\site-packages\PyInstaller\building\datastruct.py", line 158, in __postinit__
    self.assemble()
  File "c:\program files\anaconda3\lib\site-packages\PyInstaller\building\api.py", line 522, in assemble
    icon.CopyIcons(tmpnm, self.icon)
  File "c:\program files\anaconda3\lib\site-packages\PyInstaller\utils\win32\icon.py", line 177, in CopyIcons
    return CopyIcons_FromIco(dstpath, [srcpath])
  File "c:\program files\anaconda3\lib\site-packages\PyInstaller\utils\win32\icon.py", line 137, in CopyIcons_FromIco
    win32api.UpdateResource(hdst, RT_GROUP_ICON, i, data)
  File "c:\program files\anaconda3\lib\site-packages\win32ctypes\pywin32\win32api.py", line 269, in UpdateResource
    handle, type, name, language, lp_data, len(lp_data))
  File "c:\program files\anaconda3\lib\site-packages\win32ctypes\core\cffi\_resource.py", line 129, in _UpdateResource
    lpData = ffi.from_buffer(cData)
  File "c:\program files\anaconda3\lib\site-packages\cffi\api.py", line 340, in from_buffer
    return self._backend.from_buffer(self.BCharA, python_buffer)
TypeError: from_buffer() cannot return the address of the raw string within a bytes or unicode object

И да, я попытался найти последнюю строку сообщения об ошибке самостоятельно, но так и не смог найти никакой помощи.

Кстати, это приложение, в котором я делаю хочу, чтобы консоль появлялась при его запуске.

1 Ответ

0 голосов
/ 11 мая 2019

РЕДАКТИРОВАТЬ: мне пришлось перезагрузить весь компьютер, и на этот раз Python был установлен как есть, и не использовал Anaconda, как я использовал ранее. На этот раз Pyinstaller работал нормально.

ОРИГИНАЛЬНЫЙ ОТВЕТ (неотредактированный):

Я не смог заставить работать Pyinstaller, но есть обходной путь. Вы можете сначала скомпилировать программу без значка (pyinstaller.exe --onefile main.py) в командной строке, а затем использовать программу под названием Resource Hacker (http://www.angusj.com/resourcehacker/), чтобы впоследствии изменить значок.

После изменения значка с помощью Resource Hacker вам может понадобиться переместить исполняемый файл в другое место, чтобы значок появился в файловом менеджере. Я переместил исполняемый файл на свою SD-карту, и затем появился значок, который появляется также при копировании исполняемого файла обратно на жесткий диск моего компьютера.

...