IndexError: index de tuple hors de portée lors de l'utilisation de py2exe

106

J'essaie actuellement de créer un exécutable en utilisant py2exe. J'utilise Python 3.6. Le script que j'utilise importe openpyxlet pptxfonctionne correctement lorsque j'utilise Pycharm ou que j'exécute le script à l'aide de la fenêtre de commande.

La sortie produit l'erreur:

IndexError: tuple index out of range

Ci-dessous vous pouvez trouver la cmdsortie:

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>

Qu'est-ce qui cause le IndexError?

Edit: voici le setup.pyfichier:

from distutils.core import setup
import py2exe

setup(console=['Storybookmaker.py'])
Dennis
la source
2
pouvez-vous nous montrer votre setup.pydossier? parce que le problème est là et non dans py2exelequel fonctionne bien.
Jean-François Fabre
1
Salut Jean-François, j'ai ajouté le fichier dans le message d'origine. Merci d'avance!
Dennis
1
est le Storybookmaker.pyfichier dans le même répertoire que setup.py? vous pouvez essayer setup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])d'être sûr de localiser le fichier.
Jean-François Fabre
1
@ Jean-FrancoisFabre Setup.py et Storybookmaker.py dans le dossier C: \ Python36, donc cela ne devrait pas avoir d'importance, mais je l'ai essayé quand même avec votre code. Il obtient le même IndexError. D'autres pensées?
Dennis

Réponses:

96

Python 3.6 a complètement repensé le bytecode pour CPython (ce n'est plus du tout un code "byte", c'est un wordcode, où tous les opcodes ont une largeur de deux octets au lieu de 1-3).

L'échec que vous voyez se produit dans le py2execode d'analyse d'opcode, qui, étant donné la version la plus récente publiée de la py2exeprise en charge des revendications 3.3 et 3.4 uniquement, ne pourrait pas avoir connaissance ou prise en charge des nouveaux opcodes wordcode; ils n'avaient même pas été conçus au moment de la py2exedernière mise à jour. Le bytecode change souvent de petites manières d'une version à l'autre, ce qui pourrait casser même Python 3.5 (étant donné que seul le support 3.3 et 3.4 est revendiqué explicitement), mais 3.6 est garanti à 100%.

Mettre à jour: À ce stade (novembre 2019), cela fait plus de cinq ans depuis la dernière py2exeversion , et au début de 2020 (lorsque le support de Python 2 sera complètement abandonné), il ne fonctionnera sur aucune version prise en charge de Python (la 3.4 est déjà sortie de soutien). Je pense qu'il est prudent de dire que le projet est abandonné; trouver d'autres options, par exemple cx_Freezeou PyInstaller.

ShadowRanger
la source
4
Alors n'y a-t-il pas d'alternatives?
Alex Jolig
@AlexJolig: Il y en a, bien que je n'ai pas vérifié s'ils sont tous compatibles avec Python 3.6. Je connais PyInstaller et cx_Freeze; il peut y en avoir d'autres.
ShadowRanger
8
J'ai testé cx_freeze. Il est compatible avec python3.6 mais il ne peut pas créer un seul fichier exe. Le problème Pyinstallerest que vous ne pouvez pas créer de fichier exe x86 via un système d'
exploitation
Merci pour cette information. Je dois dire que je suis légèrement surpris que ce ne soit pas vraiment documenté quelque part. Même la description py2exe dit simplement Python 3.3 and later are supported. Bien sûr, avec le recul, il est probablement un peu naïf de s'attendre à ce que quelque chose d'aussi vieux fonctionne, mais lorsque vous êtes un débutant dans ce domaine, il y a suffisamment de confusion pour les débutants.
fostandy
39

La solution que j'ai utilisée était d'utiliser PyInstaller comme alternative car Py2Exe a arrêté le développement à python 3.4 et ne fonctionnera pas avec les versions plus récentes.

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

Cela créera un sous-répertoire appelé dist avec le yourprogram.exe contenu dans un dossier appelé yourprogram.

Utilisez -F pour placer tous les fichiers générés dans un fichier exécutable.

C:/>pyinstaller -F yourprogram

Use peut utiliser -w to si vous souhaitez supprimer l'affichage de la console pour les interfaces graphiques.

C:/>pyinstaller -w yourprogram.py

Tout mettre ensemble.

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

En savoir plus sur PyInstaller ici .

Python version 3.7.3.

se reproduit jusqu'à ce que
la source
2
Si j'exécute le programme sur d'autres ordinateurs, j'obtiens "Aucun module trouvé d'erreurs .."
yarin Cohen
merci pour votre solution sur pyinstaller. réussir à créer un projet autonome en utilisant la version minggw64 python3.8.2 et gtk sous Windows 10: gi, gtk, dlls .. tout est ici dans le dossier dist en utilisant une simple commande "$ pyinstaller yourprogram" dans le shell minggw64. pyinstaller + cython ressemble à un joli combo.
jerome le
10

J'ai eu le même problème, comme solution de contournement, j'ai utilisé cx_freeze. Mon application est basée sur wxPython, Windows 10, Python 3.6, cx_freeze 5.5.1

C'est le fichier d'installation que j'ai utilisé et j'ai obtenu le fichier msi sur le dossier dist.

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

puis python setup.py bdist_msi

Ezequiel Alanís
la source
4
Comme vous, j'ai utilisé cx_freeze pour créer un exécutable car il était compatible avec ma version python et plus facile à utiliser. Merci d'avoir partagé votre fichier de configuration afin que les gens puissent l'utiliser comme exemple.
Dennis
Si je l'ai, from PyQt5 import QtGuicomment puis-je le saisir packages? Seulement PyQt5ou seulement QtGuiou les deux?
Hrvoje T
Hrvoje T, j'ai inclus le tout PyQt5.
Taras Mykhalchuk
7

J'ai essayé une solution de contournement, en installant Python 3.4.3:

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

1) entrez dans votre dossier de script

2) désactiver tout antivirus que vous avez (chose étrange, savoir par une autre question SO xD)

3) appelez l'interpréteur python 3.4.3 par son chemin absolu, dans mon cas, j'ai installé dans:

C:\Python34

4) exécuter la commande

C:\Python34\python.exe setup.py py2exe
Ricardo Martínez
la source
J'ai essayé de faire la même chose avec Python 3.5 mais je suis resté bloqué lors de l'installation de py2exe car pip a besoin d'une version plus récente, j'obtiens une erreur. 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.Lorsque j'essaye de mettre à jour pip, j'obtiens la même erreur!
Dennis
Comme je le vois, vous avez 2 choix: 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?peut-être avez-vous 2 python et devez spécifier celui que vous souhaitez mettre à jour.
Ricardo Martínez
au fait, @Dennis
Ricardo Martínez
Martinez la version dit maintenant 3,5 au lieu de 3,6. J'ai spécifié le chemin vers 3.5 et le pip 8.1.1 n'est installé que pour 3.5, car 3.6 a déjà la version 9.0.1. Je vais vous donner des conseils avec plusieurs versions.
Dennis
Désolé pour le retard, entrez dans votre dossier Python et exécutez 'python -m pip install --upgrade pip', et mettez à jour votre Python 3.5 Pip
Ricardo Martínez