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


106

На даний момент я намагаюся зробити виконуваний файл за допомогою 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. Будь-які інші думки?
Денніс

Відповіді:


96

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.


4
Тож чи немає альтернатив?
Алекс Джоліг

@AlexJolig: Є, хоча я не перевіряв, чи всі вони сумісні з Python 3.6. Я знаю про PyInstaller та cx_Freeze; можуть бути й інші.
ShadowRanger

8
Я тестував cx_freeze. Він сумісний з python3.6, але він не може створити жодного файлу exe. Проблема Pyinstallerполягає в тому, що ви не можете створити x86 exe-файл через x64 os
Alex Jolig

Дякую за цю інформацію Потрібно сказати, що я м'яко здивований, що це насправді десь не документально підтверджено. Навіть опис py2exe просто говорить Python 3.3 and later are supported. Звичайно, заздалегідь, мабуть, трохи наївно сподіватись, що щось таке старе працюватиме, але коли ти новачок у цьому просторі, з цим стикається достатньо новичок.
fostandy

39

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

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

Це створить підкаталог під назвою dist з yourprogram.exe, що міститься в папці, що називається yourprogram.

Використовуйте -F, щоб розмістити всі згенеровані файли в одному виконаному файлі.

C:/>pyinstaller -F yourprogram

Використовувати може використовувати -w до, якщо ви хочете видалити консольний дисплей для GUI.

C:/>pyinstaller -w yourprogram.py

Поклавши все це більше.

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

Детальніше про PyInstaller читайте тут .

Версія Python 3.7.3.


2
Якщо я запускаю програму на інших комп’ютерах, я отримую "Не знайдено жодних модулів помилок .."
yarin Cohen

дякую за ваше рішення про pyinstaller. успішно вдається створити окремий проект, використовуючи minggw64 python3.8.2 випуску та gtk у Windows 10: gi, gtk, dlls. 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

Хрвойо Т, я включив ціле PyQt5.
Тарас Михальчук


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, я отримую ту ж помилку!
Денніс

Як я бачу, у вас є два варіанти: 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 python і вам потрібно вказати, який саме ви хочете оновити.
Рікардо Мартінес

до речі, @Dennis
Рікардо Мартінес

У версії Martinez тепер сказано, що 3,5 замість 3,6. Я вказав шлях до 3.5, а pip 8.1.1 встановлений лише для 3.5, оскільки 3.6 вже має 9.0.1. Я буду пробувати ваші поради з кількома версіями.
Денніс

Вибачте за затримку, введіть у свою папку Python та запустіть 'python -m pip install - update pip' та оновіть Python 3.5 Pip
Рікардо Мартінес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.