IndexError: индекс кортежа вне допустимого диапазона при использовании py2exe

107

В настоящее время я пытаюсь создать исполняемый файл с помощью py2exe. Я использую Python 3.6. Сценарий я использую импорт openpyxlи pptxи прекрасно работает , когда я использую PyCharm или запустить скрипт , используя окно командной строки.

Результат выдает ошибку:

IndexError: tuple index out of range

Ниже вы можете найти 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'])
Деннис
источник
2
можешь показать нам свой setup.pyфайл? потому что проблема там а не в py2exeчем нормально работает.
Жан-Франсуа Фабр
1
Привет, Жан-Франсуа, я добавил файл в исходный пост. Заранее спасибо!
Деннис
1
является Storybookmaker.pyфайл в том же каталоге setup.py? вы можете попытаться setup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])найти файл.
Жан-Франсуа Фабр
1
@ Jean-FrancoisFabre И setup.py, и Storybookmaker.py в папке C: \ Python36, так что это не имеет значения, но я все равно попробовал это с вашим кодом. Получится та же ошибка IndexError. Есть другие мысли?
Деннис

Ответы:

98

Python 3.6 полностью переработал байт-код для CPython (это уже не «байтовый» код, это текстовый код, где все коды операций имеют ширину два байта вместо 1–3).

Сбой, который вы видите, происходит в py2exeкоде синтаксического анализа кода операции, который, учитывая последнюю опубликованную версию py2exeподдержки утверждений только для 3.3 и 3.4, возможно, не может знать или поддерживать новые коды операций кода операции; они даже не были задуманы во время py2exeпоследнего обновления. Байт-код часто меняется незначительно от версии к версии, что может нарушить даже Python 3.5 (учитывая, что явно заявлена ​​поддержка только 3.3 и 3.4), но 3.6 гарантированно на 100% потерпит неудачу.

Обновление: на данный момент (ноябрь 2019 г.) прошло более пяти лет с момента последнего py2exeвыпуска , и к началу 2020 г. (когда поддержка Python 2 полностью прекратится) он не будет работать ни на одной поддерживаемой версии Python (3.4 уже отсутствует. поддержки). Я думаю, можно с уверенностью сказать, что проект заброшен; найдите другие варианты, например cx_Freezeили PyInstaller.

ShadowRanger
источник
4
Так нет альтернативы?
Alex Jolig
@AlexJolig: Есть, хотя я не проверял, все ли они совместимы с Python 3.6. Я знаю PyInstaller и cx_Freeze; могут быть и другие.
ShadowRanger
8
Я тестировал cx_freeze. Он совместим с python3.6, но не может создать ни одного exe-файла. Проблема в Pyinstallerтом, что вы не можете создать exe-файл x86 через операционную систему x64
Алекс Джолиг
Спасибо за эту информацию. Должен сказать, я слегка удивлен, что это где-то не задокументировано заранее. Даже описание py2exe просто говорит Python 3.3 and later are supported. Конечно, оглядываясь назад, вероятно, немного наивно ожидать, что что-то настолько старое сработает, но когда вы новичок в этой сфере, у новичков достаточно проблем, с которыми нужно иметь дело.
fostandy
40

Решение, которое я использовал, заключалось в использовании PyInstaller в качестве альтернативы, потому что Py2Exe остановил разработку на python 3.4 и не будет работать с более новыми версиями.

C:/>pip install pyinstaller
C:/>pyinstaller yourprogram.py

Это создаст подкаталог с именем dist с файлом yourprogram.exe, содержащимся в папке с именем yourprogram.

Используйте -F, чтобы поместить все сгенерированные файлы в один исполняемый файл.

C:/>pyinstaller -F yourprogram

Используйте -w to, если вы хотите убрать отображение консоли для графического интерфейса.

C:/>pyinstaller -w yourprogram.py

Собираем все вместе.

C:/>pyinstaller -w -F yourprogram.py

Узнайте больше о PyInstaller здесь .

Python версии 3.7.3.

рекурсивно
источник
2
Если я запускаю программу на других компьютерах, я получаю «Ошибки не найдены»
Ярин Коэн
спасибо за ваше решение о pyinstaller. успешно удалось создать автономный проект с использованием выпуска minggw64 python3.8.2 и gtk в Windows 10: gi, gtk, dlls .. все находится здесь, в папке dist, с помощью простой команды «$ pyinstaller yourprogram» в оболочке minggw64. pyinstaller + cython выглядит как хорошая комбинация.
Джером
10

У меня была такая же проблема, в качестве обходного пути я использовал 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
Как и вы, я использовал cx_freeze для создания исполняемого файла, потому что он был совместим с моей версией python и более прост в использовании. Спасибо, что поделились своим установочным файлом, чтобы люди могли использовать его в качестве примера.
Деннис
Если есть, from PyQt5 import QtGuiкак мне его ввести packages? Только PyQt5или только QtGuiили оба?
Hrvoje T
Hrvoje T, я включил все PyQt5.
Тарас Михальчук
7

Я добился успеха с программой Python 3.6 с использованием вилки py2exe по адресу https://github.com/albertosottile/py2exe .

Расджид Уилкокс
источник
У меня работает на Python 3.7
adejones
7

Я попробовал обходной путь, установив Python 3.4.3:

C:\socket> c:\Python34\python.exe setup.py py2exe

1) войдите в свою папку скрипта

2) деактивируйте любой антивирус, который у вас есть (странная вещь, знаю по другому вопросу SO xD)

3) вызовите интерпретатор python 3.4.3 по его абсолютному пути, в моем случае я установил в:

C:\Python34

4) выполнить команду

C:\Python34\python.exe setup.py py2exe
Рикардо Мартинес
источник
Я попытался сделать то же самое с Python 3.5, но застрял при установке py2exe, потому что pip нужна более новая версия, я получаю сообщение об ошибке. You are using pip version 8.1.1, however version 9.0.1 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command.Когда я пытаюсь обновить pip, я получаю ту же ошибку!
Деннис
Как я вижу, у вас есть 2 варианта: 1) Try with Python 3.4.3, this one i have already tested. 2) Identify which python you have, when you type at console 'python', what version says?может быть, у вас 2 питона, и вам нужно указать, какой из них вы хотите обновить.
Рикардо Мартинес
кстати, @Dennis
Рикардо Мартинес
Мартинес, версия теперь говорит 3.5 вместо 3.6. Я указал путь к 3.5, и пип 8.1.1 установлен только для 3.5, потому что 3.6 уже имеет 9.0.1. Я попробую ваш совет с несколькими версиями.
Деннис
Извините за задержку, войдите в свою папку Python и запустите python -m pip install --upgrade pip и обновите свой Python 3.5 Pip
Рикардо Мартинес,
0

На момент написания последняя версия python - 3.8, а py2exe работает до python-3.4. pyinstaller работает до python-3.7. Использование параметров командной строки pyinstaller (например, --onefile для создания автономного исполняемого файла) проще, чем параметры кодирования в py2exe setup.py ... Тем более, что файлы setup.py, которые работали для python2, не работают для python3.

Итак, безвременное решение использует python-модуль virtualenv . Затем вы можете создать свой исполняемый файл, не удаляя текущую версию python вместе со всеми его модулями, чтобы заменить его более старой версией.

C:\Users\jf>pip install virtualenv
C:\Users\jf>python -m virtualenv box37 -p c:\users\jf\python37\python.exe
C:\Users\jf>C:\Users\jf\box37\Scripts\activate
(box37) C:\Users\jf>
(box37) C:\Users\jf>pip install pyinstaller
(box37) C:\Users\jf>pyinstaller --onefile test.py
(box37) C:\Users\jf>deactivate
C:\Users\jf>

Параметр командной строки -pc: \ path \ to \ target \ python \ интерпретатор чувствителен к регистру! Для pyinstaller используйте путь, по которому вы загрузили python-3.7 в ( py2exe - путь к 3.4).

При создании виртуального env. генерирует каталог с вашим именем (например, box37) в рабочем каталоге. Выполнение скрипта \ Script \ activate внутри этого каталога попадает в виртуальный env. - уведомление (box37), появляющееся перед моим запросом.

Внутри виртуального окружения python. pip используется для установки модулей, которые не будут доступны для python извне - обратите внимание, что у него есть собственный каталог \ Lib \ site-packages. Следовательно, что делает virtualenv идеальным модулем для настройки тестирования - если вы ошиблись, просто удалите каталог (например, box37).

Загрузите Python 3.7 , исполняемый установщик Windows x86-64. Загрузите Python 3.4 , установщик MSI для Windows x86-64.

Jakethefinn
источник