IndexError:使用 py2exe 时元组索引超出范围
Posted
技术标签:
【中文标题】IndexError:使用 py2exe 时元组索引超出范围【英文标题】:IndexError: tuple index out of range when using py2exe 【发布时间】:2017-05-25 12:45:29 【问题描述】:我目前正在尝试使用 py2exe 制作可执行文件。我使用 Python 3.6。我正在使用的脚本导入 openpyxl
和 pptx
并且在我使用 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
及更高版本),就不会出现此问题。
py2exe
0.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_Freeze
或 PyInstaller
。
【讨论】:
那么就没有其他选择了吗? @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.8,py2exe 可以工作到 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中修复“IndexError:元组索引超出范围”?