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

2025-02-21 08:50:00
admin
原创
6
摘要:问题描述:我目前正在尝试使用 py2exe 制作可执行文件。我使用 Python 3.6。当我使用 Pycharm 或使用命令窗口运行脚本时,我正在使用的脚本导入并运行良好openpyxl。pptx输出产生错误:IndexError: tuple index out of range 您可以在下面找到cmd输...

问题描述:

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

输出产生错误:

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:Python36libdistutilscore.py", line 148, in setup
    dist.run_commands()
  File "C:Python36libdistutilsdist.py", line 955, in run_commands
    self.run_command(cmd)
  File "C:Python36libdistutilsdist.py", line 974, in run_command
    cmd_obj.run()
  File "C:Python36libsite-packagespy2exedistutils_buildexe.py", line 188, in run
    self._run()
  File "C:Python36libsite-packagespy2exedistutils_buildexe.py", line 267, in _run
    builder.analyze()
  File "C:Python36libsite-packagespy2exe
untime.py", line 160, in analyze
    self.mf.import_hook(modname)
  File "C:Python36libsite-packagespy2exemf3.py", line 120, in import_hook
    module = self._gcd_import(name)
  File "C:Python36libsite-packagespy2exemf3.py", line 274, in _gcd_import
    return self._find_and_load(name)
  File "C:Python36libsite-packagespy2exemf3.py", line 357, in _find_and_load
    self._scan_code(module.__code__, module)
  File "C:Python36libsite-packagespy2exemf3.py", line 388, in _scan_code
    for what, args in self._scan_opcodes(code):
  File "C:Python36libsite-packagespy2exemf3.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'])

解决方案 1:

更新(2020-11-17):py2exe活着!!!

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

进一步更新(2022-11-09):现在似乎py2exe与 CPython 的最新版本保持同步(例如,py2exe在 CPython 3.11.0 本身发布后的两周内,他们发布了与 3.11 兼容的 0.13.0.0),因此看起来您可以暂时依赖持续支持。他们似乎支持任何给定版本的 4-5 个 CPython 次要版本(第一个支持 3.9 的版本放弃了对 3.4 及更早版本的支持,而增加了对 3.11 支持的最新版本放弃了对 3.7 的支持)。


py2exe 0.10发布前的原始答案

Python 3.6完全重新设计了 CPython 的字节码(它不再是“字节”代码,而是字码,其中所有操作码都是两个字节宽,而不是 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

解决方案 2:

更新 (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 的文件夹中的 yourprogram.exe。

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

C:/>pyinstaller -F yourprogram

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

C:/>pyinstaller -w yourprogram.py

把所有一切放在一起。

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

在这里阅读有关 PyInstaller 的更多信息。

Python 版本 3.7.3。

解决方案 3:

我遇到了同样的问题,解决方法是使用 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

解决方案 4:

我已经使用https://github.com/albertosottile/py2exe上的 py2exe 分支成功运行了 Python 3.6 程序。

解决方案 5:

我尝试了一种解决方法,即安装 Python 3.4.3:

C:socket> c:Python34python.exe setup.py py2exe

1)进入你的脚本文件夹

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

3)通过绝对路径调用python 3.4.3解释器,就我而言,我安装在:

C:Python34

4)执行命令

C:Python34python.exe setup.py py2exe

解决方案 6:

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

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

C:Usersjf>pip install virtualenv
C:Usersjf>python -m virtualenv box37 -p c:/usersjfpython37python.exe
C:Usersjf>C:Usersjfox37Scriptsactivate
(box37) C:Usersjf>
(box37) C:Usersjf>pip install pyinstaller
(box37) C:Usersjf>pyinstaller --onefile test.py
(box37) C:Usersjf>deactivate
C:Usersjf>

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

创建虚拟环境后,会在工作目录中生成一个以您指定名称命名的目录(例如 box37)。在此目录中执行脚本\Script\activate会进入虚拟环境 - 注意(box37)出现在我的提示符之前。

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

下载 Python 3.7、Windows x86-64 可执行安装程序。下载 Python 3.4、Windows x86-64 MSI 安装程序。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1267  
  IPD(Integrated Product Development)即集成产品开发,是一套先进的、成熟的产品开发管理理念、模式和方法。随着市场竞争的日益激烈,企业对于提升产品开发效率、降低成本、提高产品质量的需求愈发迫切,IPD 项目管理咨询市场也迎来了广阔的发展空间。深入探讨 IPD 项目管理咨询的市场需求与发展,...
IPD集成产品开发流程   27  
  IPD(Integrated Product Development)产品开发流程是一套先进的、被广泛应用的产品开发管理体系,它涵盖了从产品概念产生到产品推向市场并持续优化的全过程。通过将市场、研发、生产、销售等多个环节紧密整合,IPD旨在提高产品开发的效率、质量,降低成本,增强企业的市场竞争力。深入了解IPD产品开发...
IPD流程中TR   31  
  IPD(Integrated Product Development)测试流程是确保产品质量、提升研发效率的关键环节。它贯穿于产品从概念到上市的整个生命周期,对企业的成功至关重要。深入理解IPD测试流程的核心要点,有助于企业优化研发过程,打造更具竞争力的产品。以下将详细阐述IPD测试流程的三大核心要点。测试策略规划测试...
华为IPD   26  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,在创新管理与技术突破方面发挥了至关重要的作用。深入剖析华为 IPD 流程中的创新管理与技术突破,对于众多企业探索自身发展路径具有重要的借鉴意义。IPD 流程概述IPD 流程是一种先进的产品开发管理理念和方...
TR评审   26  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用