I'm currently trying to make an executable using py2exe. I use Python 3.6. The script I'm using imports openpyxl
and pptx
and runs fine when I use Pycharm or run the script using the command window.
The output produces the error:
IndexError: tuple index out of range
Below you can find the cmd
output:
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>
What causes the IndexError
?
Edit: here is the setup.py
file:
from distutils.core import setup
import py2exe
setup(console=['Storybookmaker.py'])
py2exe
LIVES!!!Apparently my pessimism a year ago (see "Update" at bottom of original post) was unwarranted. py2exe
released new versions in October and November of 2020, supporting 3.5-3.8 in 0.10.0.2
and adding 3.9 support in 0.10.1.0
(dropping support for 3.4 and earlier). As long as you upgrade to an appropriate py2exe
version (0.10
and higher), this problem should not occur.
Further update (2022-11-09): It looks like py2exe
is staying up to date with the latest releases of CPython now (e.g. they released 0.13.0.0, a 3.11 compatible py2exe
, within two weeks of CPython 3.11.0 itself being released) so it looks like you can rely on continuing support for the time being. They seem to be supporting 4-5 minor releases of CPython for any given release (the first release with 3.9 support dropped support for 3.4 and earlier, and the latest release that added support for 3.11 dropped 3.7 support).
py2exe
0.10
releasePython 3.6 completely redesigned the bytecode for CPython (it's not a "byte" code at all anymore, it's a wordcode, where all opcodes are two bytes wide instead of 1-3).
The failure you're seeing occurs in py2exe
opcode parsing code, which, given the most recent posted version of py2exe
only claims support for 3.3 and 3.4, could not possibly have knowledge of, or support for, the new wordcode opcodes; they hadn't even been conceived of at the time py2exe
was last updated. The bytecode often changes in small ways from version to version that could break even Python 3.5 (given only 3.3 and 3.4 support is claimed explicitly), but 3.6 is 100% guaranteed to fail.
Update: At this point (November 2019), it's been over five years since the last py2exe
release, and by the beginning of 2020 (when Python 2 support lapses completely), it will not run on any supported version of Python (3.4 is already out of support). I think it's safe to say the project is abandoned; find other options, e.g. cx_Freeze
or PyInstaller
.
Update (2021-11-3): As @ShadowRanger has said in his update py2exe lives. Also Version 0.10.1.0 has dropped support for python 3.5 or less PyInstaller or cx_Freeze can be used as an alternative.
Original Answer
The solution I used was to use PyInstaller as an alternative because Py2Exe stopped development at python 3.4 and will not work with newer versions.
C:/>pip install pyinstaller
C:/>pyinstaller yourprogram.py
This will create a subdirectory called dist with the yourprogram.exe contained in a folder called yourprogram.
Use -F to place all generated files in one executable file.
C:/>pyinstaller -F yourprogram
Use can use -w to if you want to remove console display for GUI's.
C:/>pyinstaller -w yourprogram.py
Putting it all togerther.
C:/>pyinstaller -w -F yourprogram.py
Read more about PyInstaller here.
Python version 3.7.3.
I had same problem, as workaround I used cx_freeze. My app is based on wxPython, windows 10, python 3.6, cx_freeze 5.5.1
This is the setup file that I used and I got msi file on dist folder.
#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")]
)`
then python setup.py bdist_msi
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With