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'])
Dennis
fonte
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.

ShadowRanger
fonte
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.

recurse até para
fonte
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

Ezequiel Alanís
fonte
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

Tive sucesso com um programa Python 3.6 usando o fork do py2exe em https://github.com/albertosottile/py2exe .

Rasjid Wilcox
fonte
Funciona para mim no Python 3.7
adejones
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
Ricardo Martínez
fonte
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