Подтвердить что ты не робот

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'])
4b9b3361

Ответ 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

надеюсь, что мне понравится