110 votes

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

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

La sortie produit l'erreur :

IndexError: tuple index out of range

Vous trouverez ci-dessous les cmd sortie :

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.py fichier :

from distutils.core import setup
import py2exe

setup(console=['Storybookmaker.py'])

2 votes

Pouvez-vous nous montrer votre setup.py car le problème se trouve à cet endroit et non dans le fichier py2exe qui fonctionne bien.

1 votes

Bonjour Jean-Francois, j'ai ajouté le fichier dans le post original. Merci d'avance !

1 votes

Est le Storybookmaker.py dans le même répertoire que setup.py ? vous pouvez essayer setup(console=[os.path.join(os.path.dirname(__file__,'Storyb‌​ookmaker.py')]) pour être sûr de localiser le fichier.

101voto

ShadowRanger Points 44

Mise à jour (2020-11-17) : py2exe VIVRE ! !!

Apparemment, mon pessimisme d'il y a un an (voir "Mise à jour" au bas du message original) était injustifié. py2exe a publié de nouvelles versions en octobre et novembre 2020, prenant en charge les versions 3.5-3.8 en 0.10.0.2 et l'ajout du support 3.9 dans 0.10.1.0 (abandon de la prise en charge des versions 3.4 et antérieures). Tant que vous effectuez une mise à jour vers une version appropriée de py2exe version ( 0.10 et plus), ce problème ne devrait pas se produire.


Réponse originale avant py2exe 0.10 libérer

Python 3.6 refonte complète du bytecode pour CPython (ce n'est plus du tout un code "octet", 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 py2exe code d'analyse des opcodes, ce qui, compte tenu de la dernière version affichée de py2exe ne revendique que la prise en charge des versions 3.3 et 3.4, ne pouvait pas connaître ou prendre en charge les nouveaux opcodes wordcode ; ils n'avaient même pas été conçus à l'époque. py2exe a été mis à jour pour la dernière fois. Le bytecode change souvent de façon minime d'une version à l'autre, ce qui pourrait même casser Python 3.5 (étant donné que seul le support des versions 3.3 et 3.4 est explicitement revendiqué), mais l'échec de la version 3.6 est garanti à 100%.

Mise à jour : À ce stade (novembre 2019), cela fait plus de cinq ans que le dernier py2exe libérer D'ici le début de l'année 2020 (date à laquelle le support de Python 2 cessera complètement), il ne fonctionnera plus sur aucune version de Python (la version 3.4 n'est déjà plus supportée). Je pense que l'on peut dire que le projet est abandonné ; trouvez d'autres options, par ex. cx_Freeze o PyInstaller .

4 votes

Il n'y a donc pas d'alternatives ?

0 votes

@AlexJolig : Il y en a, mais je n'ai pas vérifié s'ils sont tous compatibles avec Python 3.6. Je connais PyInstaller et cx_Freeze, il y en a peut-être d'autres.

8 votes

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 avec Pyinstaller c'est que vous ne pouvez pas créer un fichier exe x86 avec un système x64.

41voto

recurseuntilfor Points 51

Mise à jour (2021-11-3) : Comme @ShadowRanger l'a dit dans sa mise à jour py2exe vit. Aussi la version 0.10.1.0 a abandonné le support de python 3.5 ou moins. PyInstaller ou cx_Freeze peuvent être utilisés comme alternative.


Réponse originale

La solution que j'ai utilisée est d'utiliser PyInstaller comme alternative car Py2Exe a arrêté son développement à la version 3.4 de python 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 fichier yourprogram.exe contenu dans un dossier appelé yourprogram.

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

C:/>pyinstaller -F yourprogram

Vous pouvez utiliser -w si vous voulez supprimer l'affichage de la console pour les interfaces graphiques.

C:/>pyinstaller -w yourprogram.py

Mettre tout ça en place.

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

En savoir plus sur PyInstaller aquí .

Python version 3.7.3.

2 votes

Si je lance le programme sur d'autres ordinateurs, j'obtiens "No module found erros.."

0 votes

Merci pour votre solution concernant pyinstaller. j'ai réussi à créer un projet autonome en utilisant la version minggw64 de python3.8.2 et gtk sur Windows 10 : gi, gtk, dlls tout est là dans le dossier dist en utilisant une simple commande "$ pyinstaller votreprogramme" dans le shell minggw64. pyinstaller + cython semble être un bon combo.

10voto

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.

Voici le fichier d'installation que j'ai utilisé et j'ai obtenu le fichier msi dans 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

4 votes

Comme vous, j'ai utilisé cx_freeze pour créer un exécutable car cela était compatible avec ma version de python et plus facile à utiliser. Merci de partager votre fichier de configuration pour que les gens puissent l'utiliser comme exemple.

0 votes

Si j'ai from PyQt5 import QtGui comment l'inscrire packages ? Seulement PyQt5 ou seulement QtGui ou les deux ?

0 votes

Hrvoje T, j'ai inclus l'ensemble de l'article PyQt5 .

7voto

Ricardo Martínez Points 446

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 script.

2) désactiver tout antivirus que vous avez (chose bizarre, connue par une autre question de SO xD)

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

C:\Python34

4) exécuter la commande

C:\Python34\python.exe setup.py py2exe

0 votes

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. Quand j'essaie de mettre à jour pip, j'obtiens la même erreur !

0 votes

Comme je le vois, vous avez deux 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? Il se peut que vous ayez 2 python et que vous deviez spécifier lequel vous voulez mettre à jour.

0 votes

Au fait, @Dennis

7voto

Rasjid Wilcox Points 173

J'ai eu du succès avec un programme Python 3.6 en utilisant le fork de py2exe à https://github.com/albertosottile/py2exe .

0 votes

Fonctionne pour moi sur Python 3.7

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X