IndexError:使用 py2exe 时元组索引超出范围
- 2025-02-21 08:50:00
- admin 原创
- 6
问题描述:
我目前正在尝试使用 py2exe 制作可执行文件。我使用 Python 3.6。当我使用 Pycharm 或使用命令窗口运行脚本时,我正在使用的脚本导入并运行良好openpyxl
。pptx
输出产生错误:
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_Freeze
或PyInstaller
。
解决方案 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.8,py2exe可以运行到 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 安装程序。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)