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


106

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

2
您可以向我们展示您的setup.py文件吗?因为问题出在那儿,而不是在那儿py2exe工作正常。
让·弗朗索瓦·法布尔

1
您好Jean-Francois,我已经在原始帖子中添加了该文件。提前致谢!
丹尼斯,

1
Storybookmaker.py文件是否位于与同一目录中setup.py?您可以尝试setup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])确保找到该文件。
让·弗朗索瓦·法布尔

1
@ Jean-FrancoisFabre C:\ Python36文件夹中的setup.py和Storybookmaker.py都没关系,但是无论如何我还是用您的代码尝试过。它得到相同的IndexError。还有其他想法吗?
丹尼斯,

Answers:


95

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


4
难道没有其他选择吗?
Alex Jolig

@AlexJolig:尽管我还没有检查它们是否都与Python 3.6兼容,但仍有。我知道PyInstaller和cx_Freeze; 可能还有其他。
ShadowRanger

8
我已经测试过了cx_freeze。它与python3.6兼容,但无法创建单个exe文件。问题Pyinstaller在于您无法通过x64操作系统创建x86 exe文件
Alex Jolig

感谢您提供此信息。必须说,我对此感到惊讶,但实际上并没有在某处预先记录。甚至py2exe的描述也只是说Python 3.3 and later are supported。当然,事后看来,期待这么古老的东西可能有点天真,但是当您是这个领域的初学者时,有足够的新手处理。
fostandy

39

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

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

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

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

C:/>pyinstaller -F yourprogram

如果要删除GUI的控制台显示,可以使用-w进行。

C:/>pyinstaller -w yourprogram.py

全部放在一起。

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

在此处阅读有关PyInstaller的更多信息

Python版本3.7.3。


2
如果我在其他计算机上运行该程序,则会收到“找不到模块错误。”
yarin Cohen,

感谢您对pyinstaller的解决方案。在Windows 10上使用minggw64 python3.8.2版本和gtk成功地成功创建了一个独立项目:gi,gtk,dlls..everything在dist文件夹中,使用minggw64 shell中的简单“ $ pyinstaller yourprogram”命令。pyinstaller + cython看起来像一个不错的组合。
杰罗姆

10

我遇到了同样的问题,因为解决方法是使用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
像您一样,我使用cx_freeze创建了一个可执行文件,因为它与我的python版本兼容并且更易于使用。感谢您共享安装文件,以便其他人可以使用它作为示例。
丹尼斯

如果我有from PyQt5 import QtGui该怎么输入packages?唯一PyQt5还是唯一QtGui或两者兼而有之?
赫尔沃耶T

赫尔沃耶T,我已经包括了全部PyQt5
Taras Mykhalchuk


7

我通过安装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需要更新的版本而被困在安装py2exe上,我得到了一个错误。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.当我尝试升级点子时,出现相同的错误!
丹尼斯,

如我所见,您有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的路径,并且仅为3.5安装了pip 8.1.1,因为3.6已经具有9.0.1。我会尽力为您提供多个版本的建议。
丹尼斯

抱歉,延迟,请输入您的Python文件夹并运行'python -m pip install --upgrade pip',然后更新您的Python 3.5 Pip
RicardoMartínez17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.