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

2025-02-21 08:47:00
admin
原创
26
摘要:问题描述:我目前正在尝试使用 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 安装程序。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用