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

Posted

技术标签:

【中文标题】IndexError:使用 py2exe 时元组索引超出范围【英文标题】:IndexError: tuple index out of range when using py2exe 【发布时间】:2017-05-25 12:45:29 【问题描述】:

我目前正在尝试使用 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'])

【问题讨论】:

你能给我们看看你的setup.py文件吗?因为问题在那里,而不是在 py2exe 中,它工作正常。 您好 Jean-Francois,我已在原始帖子中添加了文件。提前致谢! Storybookmaker.py 文件是否与setup.py 在同一目录中?您可以尝试setup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')]) 以确保找到该文件。 @Jean-FrancoisFabre setup.py 和 Storybookmaker.py 都在 C:\Python36 文件夹中,所以这无关紧要,但我还是用你的代码试过了。它得到相同的 IndexError。还有其他想法吗? @Dennis:py2exe 回来了。查看我更新的答案(如果它解决了您的问题,请检查一下)。 【参考方案1】:

更新 (2021-11-3):正如 @ShadowRanger 在他的更新 py2exe 中所说的那样。此外,版本 0.10.1.0 已放弃对 python 3.5 或更低版本的支持 PyInstaller 或 cx_Freeze 可用作替代方案。


原答案

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

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

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

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

C:/>pyinstaller -F yourprogram

如果你想删除 GUI 的控制台显示,可以使用 -w to。

C:/>pyinstaller -w yourprogram.py

把它们放在一起。

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

阅读有关 PyInstaller 的更多信息here。

Python 版本 3.7.3。

【讨论】:

如果我在其他计算机上运行该程序,我会得到“No module found erros..” 感谢您提供有关 pyinstaller 的解决方案。在 windows 10 上使用 minggw64 python3.8.2 版本和 gtk 成功地创建了一个独立项目:gi、gtk、dlls..使用 minggw64 shell 中的简单“$ pyinstaller yourprogram”命令,dist 文件夹中的所有内容都在这里。 pyinstaller + cython 看起来不错的组合。【参考方案2】:

更新(2020 年 11 月 17 日):py2exe 活着!!!

显然我一年前的悲观情绪(请参阅原帖底部的“更新”)是没有根据的。 py2exe 在 2020 年 10 月和 11 月发布了新版本,在 0.10.0.2 中支持 3.5-3.8,并在 0.10.1.0 中添加 3.9 支持(放弃对 3.4 及更早版本的支持)。只要升级到合适的py2exe 版本(0.10 及更高版本),就不会出现此问题。


py2exe0.10 发布之前的原始答案

Python 3.6 completely redesigned the bytecode for CPython(它不再是一个“字节”代码,它是一个字代码,其中所有操作码都是两个字节宽,而不是 1-3)。

您看到的故障发生在 py2exe 操作码解析代码中,鉴于最新发布的 py2exe 版本仅声称支持 3.3 和 3.4,不可能知道或支持新的字码操作码;在py2exe 上次更新时,它们甚至还没有被构思出来。字节码通常会在版本之间发生微小变化,甚至可能会破坏 Python 3.5(仅明确声明支持 3.3 和 3.4),但 3.6 保证 100% 失败。

更新:此时(2019 年 11 月),距离上次py2exe release 已经过去五年多了,到 2020 年初(Python 2 支持完全失效),它不会在任何受支持的 Python 版本上运行(3.4 已经不支持)。我认为可以肯定地说该项目已被放弃。找到其他选项,例如cx_FreezePyInstaller

【讨论】:

那么就没有其他选择了吗? @AlexJolig:有,但我没有检查它们是否都与 Python 3.6 兼容。我知道 PyInstaller 和 cx_Freeze;可能还有其他人。 我已经测试过cx_freeze。它与python3.6兼容,但不能创建单个exe文件。 Pyinstaller 的问题是您无法通过 x64 操作系统创建 x86 exe 文件 感谢您提供此信息。必须说我有点惊讶这并没有真正记录在某个地方。甚至 py2exe 描述也只是说Python 3.3 and later are supported。当然,事后看来,期望这么老的东西可以工作可能有点天真,但当你是这个领域的初学者时,有足够多的新手困惑要处理。 @fostandy:查看更新后的答案。看起来他们终于把它更新了(放弃对 3.4 和更早版本的支持,增加对 3.5 到 3.9 的支持)。【参考方案3】:

在撰写本文时,最新的 python 版本是 3.8py2exe 可以工作到 python-3.4。 pyinstaller 工作到 python-3.7。使用 pyinstaller 的命令行选项(如 --onefile 制作独立的可执行文件)比将选项编码到 py2exe 的设置中更容易.py 文件...特别是因为适用于 python2 的 setup.py 文件不适用于 python3。另一个有用的 pyinstaller 选项是 --noconsole 以使可执行文件作为后台进程启动。

因此,使用 python 模块 virtualenv 是一种省时的解决方案。然后,您无需卸载当前的 python 版本及其所有模块即可创建可执行文件,以将其替换为旧版本。

C:\Users\jf>pip install virtualenv
C:\Users\jf>python -m virtualenv box37 -p c:\users\jf\python37\python.exe
C:\Users\jf>C:\Users\jf\box37\Scripts\activate
(box37) C:\Users\jf>
(box37) C:\Users\jf>pip install pyinstaller
(box37) C:\Users\jf>pyinstaller --onefile test.py
(box37) C:\Users\jf>deactivate
C:\Users\jf>

命令行选项-p c:\path\to\target\python\interpreter,区分大小写!对于 pyinstaller,使用您下载 python-3.7 的路径(py2exe 3.4 的路径)。

创建虚拟环境时。在工作目录中生成一个具有您给定名称的目录(例如 box37)。在这个目录中执行脚本 \Script\activate 进入虚拟环境。 - 注意 (box37) 出现在我的提示之前。

在 python 虚拟环境中。 pip 用于安装外部 python 无法访问的模块 - 注意它有自己的 \Lib\site-packages 目录。因此,是什么让 virtualenv 成为完美的测试设置模块 - 如果你搞砸了,只需删除(例如 box37)目录。

Download Python 3.7,Windows x86-64 可执行安装程序。 Download Python 3.4,Windows x86-64 MSI 安装程序。

【讨论】:

【参考方案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

【讨论】:

我尝试用 Python 3.5 做同样的事情,但由于 pip 需要更新版本,我收到错误消息。 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.当我尝试升级 pip 时,我得到了同样的错误! 如我所见,您有 2 个选择: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?可能是您有 2 个 python,需要指定要更新哪一个。 顺便说一句,@Dennis Martinez 版本现在是 3.5 而不是 3.6。我指定了 3.5 的路径,并且 pip 8.1.1 只为 3.5 安装,因为 3.6 已经有 9.0.1。我会为您提供多个版本的建议。 抱歉耽搁了,进入您的 Python 文件夹并运行“python -m pip install --upgrade pip”,然后更新您的 Python 3.5 Pip【参考方案5】:

我在 Python 3.6 程序上使用https://github.com/albertosottile/py2exe 上的 py2exe 分支取得了成功。

【讨论】:

在 Python 3.7 上为我工作【参考方案6】:

我遇到了同样的问题,因为我使用了 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

【讨论】:

和你一样,我使用 cx_freeze 创建了一个可执行文件,因为它与我的 python 版本兼容并且更易于使用。感谢您分享您的设置文件,以便人们可以将此作为示例。 如果我有from PyQt5 import QtGui,我该如何输入packages?仅PyQt5 或仅QtGui 或两者兼而有之? Hrvoje T,我已经包含了整个PyQt5

以上是关于IndexError:使用 py2exe 时元组索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

python使用in操作符时元组和数组的区别分析

如何在python中修复“IndexError:元组索引超出范围”?

Sklearn 线性回归 - “IndexError:元组索引超出范围”

IndexError:元组索引超出范围

IndexError:元组索引超出范围以拆分特征和标签

一旦尝试适合预处理,train_test_split 训练数据上的“IndexError:元组索引超出范围”