IndexError: índice de tupla fora do intervalo ao usar py2exe


106

No momento, estou tentando fazer um executável usando o py2exe. Eu uso o Python 3.6. O script que estou usando importa openpyxle pptxfunciona bem quando uso o Pycharm ou executo o script usando a janela de comando.

A saída produz o erro:

IndexError: tuple index out of range

Abaixo você pode encontrar a cmdsaída:

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>

O que causa o IndexError?

Editar: aqui está o setup.pyarquivo:

from distutils.core import setup
import py2exe

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

2
você pode nos mostrar seu setup.pyarquivo? porque o problema está lá e não no py2exequal funciona bem.
— Jean-François Fabre

1
Olá Jean-François, adicionei o arquivo na postagem original. Desde já, obrigado!
— Dennis

1
o Storybookmaker.pyarquivo está no mesmo diretório que setup.py? você pode tentar setup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])localizar o arquivo.
— Jean-François Fabre

1
@ Jean-FrancoisFabre Tanto setup.py quanto Storybookmaker.py na pasta C: \ Python36, então isso não deve importar, mas tentei mesmo assim com seu código. Ele obtém o mesmo IndexError. Quaisquer outros pensamentos?
— Dennis

Respostas:


96

O Python 3.6 reprojetou completamente o bytecode para CPython (não é mais um código "byte", é um código de palavra, onde todos os opcodes têm dois bytes de largura em vez de 1-3).

A falha que você está vendo ocorre no py2execódigo de análise de opcode, que, dada a versão postada mais recente de py2exeapenas suporte de declarações para 3.3 e 3.4, não poderia ter conhecimento ou suporte para os novos opcodes de wordcode; eles nem haviam sido concebidos na época da py2exeúltima atualização. O bytecode frequentemente muda em pequenas formas de versão para versão que pode quebrar até mesmo Python 3.5 (dado apenas suporte 3.3 e 3.4 é reivindicado explicitamente), mas 3.6 é 100% garantido para falhar.

Atualização: neste ponto (novembro de 2019), já se passaram mais de cinco anos desde o último py2exelançamento , e no início de 2020 (quando o suporte do Python 2 termina completamente), ele não será executado em nenhuma versão compatível do Python (3.4 já foi lançado de suporte). Acho que é seguro dizer que o projeto está abandonado; encontre outras opções, por exemplo cx_Freezeou PyInstaller.


4
Portanto, não há alternativas?
— Alex Jolig

@AlexJolig: Existem, embora eu não tenha verificado se são todos compatíveis com Python 3.6. Estou ciente de PyInstaller e cx_Freeze; pode haver outros.
— ShadowRanger

8
Eu testei cx_freeze. É compatível com python3.6, mas não pode criar um único arquivo exe. O problema Pyinstalleré que você não pode criar um arquivo exe x86 por meio de um sistema operacional x64
— Alex Jolig

Obrigado por esta informação. Devo dizer que estou um pouco surpreso que isso não esteja realmente documentado em algum lugar. Até mesmo a descrição do py2exe apenas diz Python 3.3 and later are supported. Claro, em retrospectiva, é provavelmente um pouco ingênuo esperar que algo tão antigo funcione, mas quando você é um iniciante neste espaço, há confusões de novato o suficiente para lidar.
— Fostandy

39

A solução que usei foi usar o PyInstaller como alternativa porque o Py2Exe parou o desenvolvimento no python 3.4 e não funcionará com as versões mais recentes.

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

Isso criará um subdiretório chamado dist com yourprogram.exe contido em uma pasta chamada yourprogram.

Use -F para colocar todos os arquivos gerados em um arquivo executável.

C:/>pyinstaller -F yourprogram

Use pode usar -w para se desejar remover a exibição do console para GUIs.

C:/>pyinstaller -w yourprogram.py

Juntando tudo.

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

Leia mais sobre o PyInstaller aqui .

Python versão 3.7.3.


2
Se eu executar o programa em outros computadores, obtenho "
— Erros de

obrigado pela sua solução sobre o pyinstaller. gerenciar com sucesso a criação de um projeto autônomo usando a versão minggw64 python3.8.2 e gtk no Windows 10: gi, gtk, dlls..tudo está aqui na pasta dist usando um comando simples "$ pyinstaller yourprogram" no shell minggw64. pyinstaller + cython parece uma bela combinação.
— jerome

10

Eu tive o mesmo problema, como solução alternativa, usei cx_freeze. Meu aplicativo é baseado em wxPython, windows 10, python 3.6, cx_freeze 5.5.1

Este é o arquivo de configuração que usei e tenho o arquivo msi na pasta 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")]
)`

então python setup.py bdist_msi


4
Como você, usei cx_freeze para criar um executável porque ele era compatível com minha versão python e mais fácil de usar. Obrigado por compartilhar seu arquivo de configuração para que as pessoas possam usá-lo como um exemplo.
— Dennis

Se tenho from PyQt5 import QtGuicomo faço para entrar packages? Apenas PyQt5ou apenas QtGuiou ambos?
— Hrvoje T

Hrvoje T, incluí o todo PyQt5.
— Taras Mykhalchuk


7

Tentei uma solução alternativa instalando o Python 3.4.3:

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

1) entrar em sua pasta de script

2) desative qualquer antivírus que você tenha (coisa estranha, sei por outra pergunta do SO xD)

3) chame o interpretador python 3.4.3 por seu caminho absoluto, no meu caso, instalei em:

C:\Python34

4) execute o comando

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

Tentei fazer a mesma coisa com o Python 3.5, mas não consegui instalar o py2exe porque o pip precisa de uma versão mais recente. Recebo um erro. 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 tento atualizar o pip, recebo o mesmo erro!
— Dennis

Como vejo, você tem 2 escolhas: 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?pode ser que você tenha 2 python e precise especificar qual deseja atualizar.
— Ricardo Martínez

a propósito, @Dennis
— Ricardo Martínez

Martinez a versão agora diz 3,5 em vez de 3,6. Especifiquei o caminho para 3.5 e o pip 8.1.1 está instalado apenas para 3.5, porque 3.6 já tem 9.0.1. Vou tentar seu conselho com várias versões.
— Dennis

Desculpe pela demora, entre em sua pasta Python e execute 'python -m pip install --upgrade pip', e atualize seu Python 3.5 Pip
— Ricardo Martínez
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.