IndexError: índice de tupla fuera de rango cuando se usa py2exe

106

Actualmente estoy tratando de hacer un ejecutable usando py2exe. Yo uso Python 3.6. El script que estoy usando se importa openpyxly pptxfunciona bien cuando uso Pycharm o ejecuto el script usando la ventana de comandos.

La salida produce el error:

IndexError: tuple index out of range

A continuación puede encontrar la cmdsalida:

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>

¿Qué causa el IndexError?

Editar: aquí está el setup.pyarchivo:

from distutils.core import setup
import py2exe

setup(console=['Storybookmaker.py'])
Dennis
fuente
2
¿nos puede mostrar su setup.pyarchivo? porque el problema está ahí y no en el py2exeque funciona bien.
Jean-François Fabre
1
Hola Jean-Francois, agregué el archivo en la publicación original. ¡Gracias por adelantado!
Dennis
1
¿Está el Storybookmaker.pyarchivo en el mismo directorio que setup.py? puede intentar setup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])asegurarse de localizar el archivo.
Jean-François Fabre
1
@ Jean-FrancoisFabre Ambos setup.py y Storybookmaker.py en la carpeta C: \ Python36, así que eso no debería importar, pero lo intenté de todos modos con su código. Obtiene el mismo IndexError. ¿Algún otro pensamiento?
Dennis

Respuestas:

96

Python 3.6 rediseñó completamente el código de bytes para CPython (ya no es un código de "bytes", es un código de palabra, donde todos los códigos de operación tienen dos bytes de ancho en lugar de 1-3).

La falla que está viendo ocurre en el py2execódigo de análisis de código de operación, que, dada la versión publicada más reciente de py2exesolo soporte de reclamos para 3.3 y 3.4, posiblemente no podría tener conocimiento o soporte para los nuevos códigos de operación de código de palabra; ni siquiera habían sido concebidos en el momento de la py2exeúltima actualización. El código de bytes a menudo cambia en pequeñas formas de una versión a otra que podrían romper incluso con Python 3.5 (dado que solo se afirma explícitamente la compatibilidad con 3.3 y 3.4), pero se garantiza al 100% que la 3.6 fallará.

Actualización: en este punto (noviembre de 2019), han pasado más de cinco años desde la última py2exeversión , y para principios de 2020 (cuando el soporte de Python 2 caduque por completo), no se ejecutará en ninguna versión compatible de Python (3.4 ya está disponible de apoyo). Creo que es seguro decir que el proyecto está abandonado; buscar otras opciones, por ejemplo, cx_Freezeo PyInstaller.

ShadowRanger
fuente
4
Entonces, ¿no hay alternativas?
Alex Jolig
@AlexJolig: Las hay, aunque no he comprobado si todas son compatibles con Python 3.6. Soy consciente de PyInstaller y cx_Freeze; puede haber otros.
ShadowRanger
8
Lo he probado cx_freeze. Es compatible con python3.6 pero no puede crear un solo archivo exe. El problema Pyinstalleres que no puede crear un archivo exe x86 a través de un sistema
operativo
Gracias por esta información Debo decir que estoy un poco sorprendido de que esto no esté realmente documentado en alguna parte. Incluso la descripción de py2exe simplemente dice Python 3.3 and later are supported. Claro, en retrospectiva, probablemente sea un poco ingenuo esperar que algo tan viejo funcione, pero cuando eres un principiante en este espacio, hay suficientes confusiones para principiantes con las que lidiar.
Fostandy
39

La solución que utilicé fue usar PyInstaller como alternativa porque Py2Exe detuvo el desarrollo en python 3.4 y no funcionará con versiones más nuevas.

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

Esto creará un subdirectorio llamado dist con yourprogram.exe contenido en una carpeta llamada yourprogram.

Utilice -F para colocar todos los archivos generados en un archivo ejecutable.

C:/>pyinstaller -F yourprogram

Puede usar -w para si desea eliminar la pantalla de la consola para las GUI.

C:/>pyinstaller -w yourprogram.py

Poniéndolo todo junto.

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

Lea más sobre PyInstaller aquí .

Python versión 3.7.3.

recurrente hasta
fuente
2
Si ejecuto el programa en otras computadoras,
aparece
gracias por su solución sobre pyinstaller. Logre crear con éxito un proyecto independiente usando la versión minggw64 python3.8.2 y gtk en Windows 10: gi, gtk, dlls .. todo está aquí en la carpeta dist usando un simple comando "$ pyinstaller yourprogram" en el shell minggw64. pyinstaller + cython parece una buena combinación.
Jerome
10

Tuve el mismo problema, como solución temporal utilicé cx_freeze. Mi aplicación está basada en wxPython, windows 10, python 3.6, cx_freeze 5.5.1

Este es el archivo de configuración que utilicé y obtuve el archivo msi en la carpeta 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")]
)`

luego python setup.py bdist_msi

Ezequiel Alanís
fuente
4
Como tú, usé cx_freeze para crear un ejecutable porque era compatible con mi versión de Python y más fácil de usar. Gracias por compartir su archivo de instalación para que la gente pueda usarlo como ejemplo.
Dennis
Si lo tengo, from PyQt5 import QtGui¿cómo lo ingreso packages? ¿Solo PyQt5o solo QtGuio ambos?
Hrvoje T
Hrvoje T, he incluido el conjunto PyQt5.
Taras Mykhalchuk
7

Probé una solución alternativa, instalando Python 3.4.3:

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

1) ingrese en su carpeta de script

2) desactiva cualquier antivirus que tengas (cosa rara, sé por otra pregunta SO xD)

3) llamar al intérprete de Python 3.4.3 por su ruta absoluta, en mi caso, lo he instalado en:

C:\Python34

4) ejecutar el comando

C:\Python34\python.exe setup.py py2exe
Ricardo Martínez
fuente
Intenté hacer lo mismo con Python 3.5 pero me quedé atascado al instalar py2exe porque pip necesita una versión más nueva, aparece un error. 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.Cuando intento actualizar pip, aparece el mismo error.
Dennis
Como veo, tiene 2 opciones: 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?puede ser que tenga 2 python y necesite especificar cuál desea actualizar.
Ricardo Martínez
por cierto, @Dennis
Ricardo Martínez
Martínez, la versión ahora dice 3.5 en lugar de 3.6. Especifiqué la ruta a 3.5 y el pip 8.1.1 solo está instalado para 3.5, porque 3.6 ya tiene 9.0.1. Probaré tus consejos con múltiples versiones.
Dennis
Disculpe la demora, ingrese en su carpeta de Python y ejecute 'python -m pip install --upgrade pip', y actualice su Python 3.5 Pip
Ricardo Martínez