Python - IndexError: индекс tuple вне диапазона при использовании py2exe
В настоящее время я пытаюсь сделать исполняемый файл с помощью py2exe. Я использую Python 3.6. script Я использую импорт openpyxl и pptx и отлично работает, когда я использую Pycharm или запускаю script с помощью командного окна. На выходе появляется ошибка:
IndexError: индекс tuple вне диапазона
Ниже вы можете найти вывод cmd:
C:\Python36>python setup.py py2exe
running py2exe
Traceback (most recent call last):
File "setup.py", line 4, in <module>
setup(console=['Storybookmaker.py'])
File "C:\Python36\lib\distutils\core.py", line 148, in setup
dist.run_commands()
File "C:\Python36\lib\distutils\dist.py", line 955, in run_commands
self.run_command(cmd)
File "C:\Python36\lib\distutils\dist.py", line 974, in run_command
cmd_obj.run()
File "C:\Python36\lib\site-packages\py2exe\distutils_buildexe.py", line 188, in run
self._run()
File "C:\Python36\lib\site-packages\py2exe\distutils_buildexe.py", line 267, in _run
builder.analyze()
File "C:\Python36\lib\site-packages\py2exe\runtime.py", line 160, in analyze
self.mf.import_hook(modname)
File "C:\Python36\lib\site-packages\py2exe\mf3.py", line 120, in import_hook
module = self._gcd_import(name)
File "C:\Python36\lib\site-packages\py2exe\mf3.py", line 274, in _gcd_import
return self._find_and_load(name)
File "C:\Python36\lib\site-packages\py2exe\mf3.py", line 357, in _find_and_load
self._scan_code(module.__code__, module)
File "C:\Python36\lib\site-packages\py2exe\mf3.py", line 388, in _scan_code
for what, args in self._scan_opcodes(code):
File "C:\Python36\lib\site-packages\py2exe\mf3.py", line 417, in _scan_opcodes
yield "store", (names[oparg],)
IndexError: tuple index out of range
C:\Python36>
Что вызывает IndexError?
Изменить: вот файл setup.py
from distutils.core import setup
import py2exe
setup(console=['Storybookmaker.py'])
Ответы
Ответ 1
Python 3.6 полностью переработал байт-код для CPython (это уже не "байтовый" код, это словокод, где все коды операций два байта шириной вместо 1-3).
Сбой, который вы видите, встречается в коде синтаксического анализа кода py2exe
, который, учитывая, что последняя опубликованная версия py2exe
поддерживает только утверждения для 3.3 и 3.4, не может иметь знания или поддержки для новые коды кода wordcode; они даже не были задуманы во время последнего обновления py2exe
. Байт-код часто изменяется небольшими путями с версии на версию, которая может сломаться даже Python 3.5 (при условии, что только поддержка 3.3 и 3.4 заявлена явно), но 3.6 на 100% гарантированно сбой.
Ответ 2
Решение, которое я использовал в качестве Py2Exe, остановило разработку на python 3.4 и не будет работать с более новыми версиями, заключалось в использовании PyInstaller.
C:/>pip install pyinstaller
C:/>pyinstaller yourprogram.py
Это создаст подкаталог с именем dist с yourprogram.exe, который содержится в папке с именем yourprogram.
Используйте -F, чтобы поместить все созданные файлы в один исполняемый файл.
C:/>pyinstaller -F yourprogram
Используйте можно использовать -w, если хотите удалить отображение консоли для графического интерфейса пользователя.
C:/>pyinstaller -w yourprogram.py
Собираем все вместе.
C:/>pyinstaller -w -F yourprogram.py
Подробнее о PyInstaller здесь.
Python версия 3.7.3.
Ответ 3
У меня была та же проблема, что и в качестве обходного пути я использовал cx_freeze.
Мое приложение основано на wxPython, Windows 10, Python 3.6, cx_freeze 5.5.1
Это установочный файл, который я использовал, и я получил MSI файл в папке dist.
#setup.py
import sys, os
from cx_Freeze import setup, Executable
__version__ = "1.1.0"
include_files = ['logging.ini', 'config.ini', 'running.png']
excludes = ["tkinter"]
packages = ["os", "idna", "requests","json","base64","pyodbc"]
setup(
name = "appname",
description='App Description',
version=__version__,
options = {"build_exe": {
'packages': packages,
'include_files': include_files,
'excludes': excludes,
'include_msvcr': True,
}},
executables = [Executable("b2b_conn.py",base="Win32GUI")]
)'
тогда python setup.py bdist_msi
Ответ 4
Деннис, через несколько часов после вас, я тестирую одно и то же без везения, я установил Python 3.6 и на данный момент он не работает.
Я пытаюсь пройти, я установил Python 3.4.3 и попробую следующее:
C:\socket> c:\Python34\python.exe setup.py py2exe
1) введите в папку script
2) деактивировать любой антивирус, который у вас есть (странная вещь, знать другим вопросом SO x)
2) вызовите интерпретатор python 3.4.3 по его абсолютному пути, в моем случае я установил в:
C:\Python34
3) выполните команду
c:\Python34\python.exe setup.py py2exe
надеюсь, что мне понравится
Ответ 5
Я добился успеха с программой на Python 3.6, использующей форк py2exe на https://github.com/albertosottile/py2exe.