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'])
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%.
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.
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
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