IndexError:使用py2exe时元组索引超出范围

问题:IndexError:使用py2exe时元组索引超出范围

我目前正在尝试使用py2exe创建可执行文件。我使用Python 3.6。我正在使用的脚本可以导入openpyxlpptx在使用Pycharm或使用命令窗口运行脚本时运行良好。

输出产生错误:

IndexError: tuple index out of range

在下面可以找到cmd输出:

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>

是什么原因造成的IndexError

编辑:这是setup.py文件:

from distutils.core import setup
import py2exe

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

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'])

回答 0

Python 3.6 完全重新设计了CPython的字节码(根本不再是“字节”代码,它是字码,其中所有操作码都是2字节宽而不是1-3)。

您看到的失败发生在py2exe操作码解析代码中,鉴于py2exe仅声明支持3.3和3.4的最新发布版本,该代码可能不了解或不支持新的字码操作码。他们甚至在py2exe上次更新时都没有想到过。字节码通常在各个版本之间以较小的方式变化,甚至可以破坏Python 3.5(明确要求仅支持3.3和3.4),但是3.6确保100%失败。

更新:至此(2019年11月)距上次py2exe发布已经超过五年了,到2020年初(当Python 2支持完全失效时),它将无法在任何受支持的Python版本上运行(3.4已经淘汰)的支持)。我认为可以肯定地说该项目被放弃了。查找其他选项,例如cx_FreezePyInstaller

Python 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.


回答 1

我使用的解决方案是使用PyInstaller作为替代方案,因为Py2Exe在python 3.4处停止了开发,并且不适用于较新的版本。

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

这将创建一个名为dist的子目录,并将yourprogram.exe包含在名为yourprogram的文件夹中。

使用-F将所有生成的文件放在一个可执行文件中。

C:/>pyinstaller -F yourprogram

如果要删除GUI的控制台显示,可以使用-w进行。

C:/>pyinstaller -w yourprogram.py

全部放在一起。

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

在此处阅读有关PyInstaller的更多信息

Python版本3.7.3。

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.


回答 2

我遇到了同样的问题,因为解决方法是使用cx_freeze。我的应用程序基于wxPython,Windows 10,python 3.6,cx_freeze 5.5.1

这是我使用的安装文件,在dist文件夹中有msi文件。

#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")]
)`

然后 python setup.py bdist_msi

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


回答 3

我在https://github.com/albertosottile/py2exe上使用py2exe的分叉实现了Python 3.6程序的成功。

I’ve had success with a Python 3.6 program using the fork of py2exe at https://github.com/albertosottile/py2exe.


回答 4

我通过安装Python 3.4.3尝试了一种解决方法:

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

1)输入您的脚本文件夹

2)停用您拥有的任何防病毒软件(奇怪的事情,由另一个SO问题xD知道)

3)通过他的绝对路径调用python 3.4.3解释器,在我的情况下,我已经安装在:

C:\Python34

4)执行命令

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

I tried a workaround, by installing Python 3.4.3:

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

1) enter in your script folder

2) deactivate any antivirus that you have (weird thing, know by another SO question xD)

3) call the python 3.4.3 interpreter by his absolute path, in my case, i’ve installed in:

C:\Python34

4) execute the command

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