IndexError: Tupelindex außerhalb des Bereichs bei Verwendung von py2exe

106

Ich versuche gerade, eine ausführbare Datei mit py2exe zu erstellen. Ich benutze Python 3.6. Das Skript, das ich verwende, wird importiert openpyxlund pptxläuft einwandfrei, wenn ich Pycharm verwende oder das Skript über das Befehlsfenster ausführe.

Die Ausgabe erzeugt den Fehler:

IndexError: tuple index out of range

Unten finden Sie die cmdAusgabe:

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>

Was verursacht das IndexError?

Edit: hier ist die setup.pyDatei:

from distutils.core import setup
import py2exe

setup(console=['Storybookmaker.py'])
Dennis
quelle
2
Können Sie uns Ihre setup.pyDatei zeigen? weil das problem da ist und nicht py2exewo es gut funktioniert.
Jean-François Fabre
1
Hallo Jean-Francois, ich habe die Datei im Originalbeitrag hinzugefügt. Danke im Voraus!
Dennis
1
Befindet sich die Storybookmaker.pyDatei im selben Verzeichnis wie setup.py? Sie könnten versuchen setup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')]), sicher zu sein, die Datei zu finden.
Jean-François Fabre
1
@ Jean-FrancoisFabre Sowohl setup.py als auch Storybookmaker.py im Ordner C: \ Python36, das sollte also keine Rolle spielen, aber ich habe es trotzdem mit Ihrem Code versucht. Es erhält den gleichen IndexError. Irgendwelche anderen Gedanken?
Dennis

Antworten:

94

Python 3.6 hat den Bytecode für CPython komplett neu gestaltet (es ist überhaupt kein "Byte" -Code mehr, sondern ein Wordcode, bei dem alle Opcodes zwei Bytes breit sind anstatt 1-3).

Der Fehler, den Sie sehen, tritt beim py2exeOpcode-Parsing-Code auf, der angesichts der neuesten veröffentlichten Version von py2exenur Claims Support für 3.3 und 3.4 möglicherweise keine Kenntnis von den neuen Wordcode-Opcodes hat oder diese nicht unterstützt. Sie waren zu dem Zeitpunkt, py2exeals sie zuletzt aktualisiert wurden, noch nicht einmal konzipiert worden . Der Bytecode ändert sich häufig geringfügig von Version zu Version, wodurch Python 3.5 ausgeglichen werden kann (da nur die Unterstützung von 3.3 und 3.4 explizit beansprucht wird), aber 3.6 schlägt garantiert zu 100% fehl.

Update: Zu diesem Zeitpunkt (November 2019) sind seit der letzten py2exeVeröffentlichung mehr als fünf Jahre vergangen. Bis Anfang 2020 (wenn die Python 2-Unterstützung vollständig verfällt) wird es auf keiner unterstützten Version von Python ausgeführt (3.4 ist bereits verfügbar) der Unterstützung). Ich denke, man kann mit Sicherheit sagen, dass das Projekt aufgegeben wurde. andere Optionen finden, zB cx_Freezeoder PyInstaller.

ShadowRanger
quelle
4
Gibt es also keine Alternativen?
Alex Jolig
@AlexJolig: Es gibt, obwohl ich nicht überprüft habe, ob sie alle Python 3.6-kompatibel sind. Mir sind PyInstaller und cx_Freeze bekannt. es kann andere geben.
ShadowRanger
8
Ich habe getestet cx_freeze. Es ist kompatibel mit Python3.6, kann jedoch keine einzige Exe-Datei erstellen. Das Problem mit Pyinstallerist, dass Sie keine x86-Exe-Datei über ein x64-Betriebssystem erstellen können
Alex Jolig
Danke für diese Info. Ich muss sagen, ich bin leicht überrascht, dass dies irgendwo nicht wirklich dokumentiert ist. Sogar die py2exe-Beschreibung sagt nur Python 3.3 and later are supported. Sicher, im Nachhinein ist es wahrscheinlich ein bisschen naiv zu erwarten, dass etwas so Altes funktioniert, aber wenn Sie ein Anfänger in diesem Bereich sind, gibt es genug Neulinge, mit denen Sie sich befassen können.
Fostandy
39

Die Lösung, die ich verwendet habe, war die Verwendung von PyInstaller als Alternative, da Py2Exe die Entwicklung bei Python 3.4 gestoppt hat und mit neueren Versionen nicht funktioniert.

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

Dadurch wird ein Unterverzeichnis namens dist mit der Datei yourprogram.exe erstellt, die in einem Ordner namens yourprogram enthalten ist.

Verwenden Sie -F, um alle generierten Dateien in einer ausführbaren Datei zu platzieren.

C:/>pyinstaller -F yourprogram

Verwenden Sie kann -w verwenden, um die Konsolenanzeige für GUIs zu entfernen.

C:/>pyinstaller -w yourprogram.py

Alles zusammen.

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

Lesen Sie hier mehr über PyInstaller .

Python Version 3.7.3.

rekursiv bis
quelle
2
Wenn ich das Programm auf anderen Computern ausführe, erhalte ich "Kein Modul gefunden Fehler ..."
Yarin Cohen
Vielen Dank für Ihre Lösung zu Pyinstaller. Erstellen Sie erfolgreich ein eigenständiges Projekt mit der Version minggw64 python3.8.2 und gtk unter Windows 10: gi, gtk, dlls. Alles befindet sich hier im Ordner dist mit einem einfachen Befehl "$ pyinstaller yourprogram" in der minggw64-Shell. Pyinstaller + Cython sieht aus wie eine schöne Kombination.
Jerome
10

Ich hatte das gleiche Problem, als Problemumgehung habe ich cx_freeze verwendet. Meine App basiert auf wxPython, Windows 10, Python 3.6, cx_freeze 5.5.1

Dies ist die Setup-Datei, die ich verwendet habe, und ich habe eine MSI-Datei im dist-Ordner.

#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")]
)`

dann python setup.py bdist_msi

Ezequiel Alanís
quelle
4
Wie Sie habe ich cx_freeze verwendet, um eine ausführbare Datei zu erstellen, da diese mit meiner Python-Version kompatibel und einfacher zu verwenden war. Vielen Dank, dass Sie Ihre Setup-Datei freigegeben haben, damit die Benutzer dies als Beispiel verwenden können.
Dennis
Wenn ich habe, from PyQt5 import QtGuiwie gebe ich es ein packages? Nur PyQt5oder nur QtGuioder beides?
Hrvoje T
Hrvoje T, ich habe das Ganze aufgenommen PyQt5.
Taras Mykhalchuk
7

Ich habe versucht, dieses Problem zu umgehen, indem ich Python 3.4.3 installiert habe:

C:\socket> c:\Python34\python.exe setup.py py2exe

1) Geben Sie in Ihren Skriptordner ein

2) Deaktivieren Sie alle Antivirenprogramme, die Sie haben (seltsame Sache, wissen Sie durch eine andere SO-Frage xD)

3) Rufen Sie den Python 3.4.3-Interpreter über seinen absoluten Pfad auf. In meinem Fall habe ich Folgendes installiert:

C:\Python34

4) Führen Sie den Befehl aus

C:\Python34\python.exe setup.py py2exe
Ricardo Martínez
quelle
Ich habe versucht, dasselbe mit Python 3.5 zu tun, bin aber bei der Installation von py2exe hängen geblieben, da pip eine neuere Version benötigt. Ich erhalte eine Fehlermeldung. 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.Wenn ich versuche, pip zu aktualisieren, erhalte ich den gleichen Fehler!
Dennis
Wie ich sehe, haben Sie zwei Möglichkeiten: 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?Möglicherweise haben Sie zwei Pythons und müssen angeben, welche Sie aktualisieren möchten.
Ricardo Martínez
übrigens @Dennis
Ricardo Martínez
Martinez die Version sagt jetzt 3.5 statt 3.6. Ich habe den Pfad zu 3.5 angegeben und Pip 8.1.1 ist nur für 3.5 installiert, da 3.6 bereits 9.0.1 hat. Ich werde Sie mit mehreren Versionen beraten.
Dennis
Entschuldigen Sie die Verzögerung, geben Sie in Ihren Python-Ordner ein und führen Sie 'python -m pip install --upgrade pip' aus und aktualisieren Sie Ihren Python 3.5 Pip
Ricardo Martínez am