IndexError: indice della tupla fuori intervallo quando si utilizza py2exe


106

Attualmente sto cercando di creare un eseguibile utilizzando py2exe. Uso Python 3.6. Lo script che sto utilizzando importa openpyxle pptxfunziona correttamente quando utilizzo Pycharm o eseguo lo script utilizzando la finestra di comando.

L'output produce l'errore:

IndexError: tuple index out of range

Di seguito puoi trovare l' cmdoutput:

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>

Cosa causa il IndexError?

Modifica: ecco il setup.pyfile:

from distutils.core import setup
import py2exe

setup(console=['Storybookmaker.py'])

2
puoi mostrarci il tuo setup.pyfile? perché il problema c'è e non in py2execui funziona bene.
Jean-François Fabre

1
Ciao Jean-Francois, ho aggiunto il file nel post originale. Grazie in anticipo!
Dennis

1
il Storybookmaker.pyfile si trova nella stessa directory di setup.py? potresti provare setup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])ad essere sicuro di individuare il file.
Jean-François Fabre

1
@ Jean-FrancoisFabre Sia setup.py che Storybookmaker.py nella cartella C: \ Python36, quindi non dovrebbe importare, ma l'ho provato comunque con il tuo codice. Ottiene lo stesso IndexError. Qualche altro pensiero?
Dennis

Risposte:


96

Python 3.6 ha completamente ridisegnato il bytecode per CPython (non è più un codice "byte", è un wordcode, dove tutti gli opcode sono larghi due byte invece di 1-3).

L'errore che stai vedendo si verifica nel py2execodice di analisi del codice operativo, che, data la versione più recente pubblicata di py2exesolo sostiene il supporto per 3.3 e 3.4, potrebbe non essere a conoscenza o supporto per i nuovi codici operativi wordcode; non erano nemmeno stati concepiti al momento py2exedell'ultimo aggiornamento. Il bytecode cambia spesso in piccoli modi da versione a versione che potrebbe rompere anche Python 3.5 (dato solo il supporto 3.3 e 3.4 è richiesto esplicitamente), ma 3.6 è garantito al 100% per fallire.

Aggiornamento: a questo punto (novembre 2019), sono trascorsi più di cinque anni dall'ultima py2exeversione e all'inizio del 2020 (quando il supporto di Python 2 scade completamente), non funzionerà su nessuna versione supportata di Python (la 3.4 è già disponibile di supporto). Penso che sia sicuro dire che il progetto è stato abbandonato; trova altre opzioni, ad esempio cx_Freezeo PyInstaller.


4
Quindi non ci sono alternative?
Alex Jolig

@AlexJolig: Ci sono, anche se non ho controllato se sono tutti compatibili con Python 3.6. Sono a conoscenza di PyInstaller e cx_Freeze; potrebbero essercene altri.
ShadowRanger

8
Ho provato cx_freeze. È compatibile con python3.6 ma non può creare un singolo file exe. Il problema Pyinstallerè che non puoi creare file exe x86 tramite un sistema
operativo

Grazie per questa informazione. Devo dire che sono leggermente sorpreso che questo non sia davvero documentato da qualche parte. Anche la descrizione di py2exe dice semplicemente Python 3.3 and later are supported. Certo, col senno di poi è probabilmente un po 'ingenuo aspettarsi che qualcosa di così vecchio funzioni, ma quando sei un principiante in questo spazio, ci sono abbastanza confusione per principianti da affrontare.
fostandy il

39

La soluzione che ho usato è stata quella di utilizzare PyInstaller come alternativa perché Py2Exe ha interrotto lo sviluppo in python 3.4 e non funzionerà con le versioni più recenti.

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

Questo creerà una sottodirectory chiamata dist con yourprogram.exe contenuto in una cartella chiamata yourprogram.

Usa -F per inserire tutti i file generati in un file eseguibile.

C:/>pyinstaller -F yourprogram

Utilizzare può utilizzare -w a se si desidera rimuovere la visualizzazione della console per le GUI.

C:/>pyinstaller -w yourprogram.py

Mettendo tutto insieme.

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

Maggiori informazioni su PyInstaller qui .

Versione Python 3.7.3.


2
Se eseguo il programma su altri computer, ottengo "Nessun modulo trovato errori .."
yarin Cohen

grazie per la tua soluzione su pyinstaller. riesci a creare con successo un progetto autonomo usando il rilascio minggw64 python3.8.2 e gtk su Windows 10: gi, gtk, dlls..tutto è qui nella cartella dist usando un semplice comando "$ pyinstaller yourprogram" nella shell minggw64. pyinstaller + cython sembra una bella combinazione.
Jerome il

10

Ho avuto lo stesso problema, come soluzione alternativa ho usato cx_freeze. La mia app è basata su wxPython, windows 10, python 3.6, cx_freeze 5.5.1

Questo è il file di installazione che ho usato e ho ottenuto il file msi nella cartella 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")]
)`

poi python setup.py bdist_msi


4
Come te, ho usato cx_freeze per creare un eseguibile perché era compatibile con la mia versione di Python e più facile da usare. Grazie per aver condiviso il tuo file di installazione in modo che le persone possano usarlo come esempio.
Dennis

Se ce l'ho, from PyQt5 import QtGuicome lo inserisco packages? Solo PyQt5o solo QtGuio entrambi?
Hrvoje T

Hrvoje T, ho incluso il tutto PyQt5.
Taras Mykhalchuk


7

Ho provato una soluzione alternativa, installando Python 3.4.3:

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

1) entra nella cartella degli script

2) disattiva qualsiasi antivirus che hai (cosa strana, lo sai da un'altra domanda SO xD)

3) chiama l'interprete python 3.4.3 dal suo percorso assoluto, nel mio caso l'ho installato in:

C:\Python34

4) eseguire il comando

C:\Python34\python.exe setup.py py2exe

Ho provato a fare la stessa cosa con Python 3.5 ma sono rimasto bloccato nell'installazione di py2exe perché pip ha bisogno di una versione più recente, ricevo un errore. 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.Quando provo ad aggiornare pip, ottengo lo stesso errore!
Dennis,

Come vedo, hai 2 scelte: 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?potresti avere 2 python e devi specificare quale vuoi aggiornare.
Ricardo Martínez

a proposito, @Dennis
Ricardo Martínez

Martinez la versione ora dice 3.5 invece di 3.6. Ho specificato il percorso per 3.5 e pip 8.1.1 è installato solo per 3.5, perché 3.6 ha già 9.0.1. Proverò il tuo consiglio con più versioni.
Dennis

Ci scusiamo per il ritardo, entra nella tua cartella Python ed esegui 'python -m pip install --upgrade pip', e aggiorna il tuo Python 3.5 Pip
Ricardo Martínez
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.