No momento, estou tentando fazer um executável usando o py2exe. Eu uso o Python 3.6. O script que estou usando importa openpyxl
e pptx
funciona 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 cmd
saí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.py
arquivo:
from distutils.core import setup
import py2exe
setup(console=['Storybookmaker.py'])
setup.py
arquivo? porque o problema está lá e não nopy2exe
qual funciona bem.Storybookmaker.py
arquivo está no mesmo diretório quesetup.py
? você pode tentarsetup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])
localizar o arquivo.Respostas:
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
py2exe
código de análise de opcode, que, dada a versão postada mais recente depy2exe
apenas 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 dapy2exe
ú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
py2exe
lanç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 exemplocx_Freeze
ouPyInstaller
.fonte
cx_freeze
. É compatível com python3.6, mas não pode criar um único arquivo exe. O problemaPyinstaller
é que você não pode criar um arquivo exe x86 por meio de um sistema operacional x64Python 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.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.
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.
Use pode usar -w para se desejar remover a exibição do console para GUIs.
Juntando tudo.
Leia mais sobre o PyInstaller aqui .
Python versão 3.7.3.
fonte
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.
então
python setup.py bdist_msi
fonte
from PyQt5 import QtGui
como faço para entrarpackages
? ApenasPyQt5
ou apenasQtGui
ou ambos?PyQt5
.Tive sucesso com um programa Python 3.6 usando o fork do py2exe em https://github.com/albertosottile/py2exe .
fonte
Tentei uma solução alternativa instalando o Python 3.4.3:
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:
4) execute o comando
fonte
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!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.