web-dev-qa-db-fra.com

Python - IndexError: Index de tuple 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 et pptx et fonctionne correctement lorsque j'utilise Pycharm ou que je l'exécute à l'aide de la fenêtre de commande. La sortie produit l'erreur:

IndexError: Index de tuple hors limites

Ci-dessous vous pouvez trouver la sortie 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>

Qu'est-ce qui cause IndexError?

Edit: voici le fichier setup.py

from distutils.core import setup
import py2exe

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

Python 3.6 complètement modifié le bytecode pour CPython (ce n'est plus du tout un "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 le code d'analyse syntaxique de py2exe, qui, étant donné la version la plus récente publiée de py2exe ne réclame que le support des versions 3.3 et 3.4, ne peut ni connaître ni supporter le support de. les nouveaux opcodes wordcode; ils n'avaient même pas été conçus à l'époque où py2exe a été mis à jour pour la dernière fois. Le bytecode change souvent d’une version à l’autre, ce qui pourrait provoquer la rupture de Python 3.5 (la prise en charge des versions 3.3 et 3.4 étant explicitement revendiquée), mais l’échec de 3.6 est garanti à 100%.

64
ShadowRanger

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

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

Utilisez peut utiliser -w 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.

14
recurseuntilfor

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 récupéré 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")]
)`

alors python setup.py bdist_msi

7
Ezequiel Alanís

Dennis, quelques heures plus tard que moi, je teste la même chose sans succès, j'ai installé Python 3.6 et pour l'instant, cela ne fonctionne pas.

J'essaie un walkaround, j'ai installé Python 3.4.3, et essayez ceci:

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

1) entrez dans votre dossier de script 2) désactivez tout antivirus que vous avez (chose étrange, connu par un autre SO question xD)

2) appeler l’interprète python 3.4.3 par son chemin absolu; dans mon cas, j’ai installé dans:

C:\Python34

3) exécuter la commande

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

espérons que cette aide m'aime

5
Ricardo Martínez