[py2exe] - Executable crash avec bundle_files:1 et PIL
Bonjour,
Je m'essaye à py2exe mais je me trouve face un soucis. Je bosse sur un script exemple nommé prog.py que je souhaite "compiler" en un unique executable (à plus ou moins quelques dll). Si j'utilise l'option bundle_files à 3 (par défaut) de mon setup.py tout fonctionne très bien. Les problèmes arrivent dès que je passe à 1 (un seul exe) ou 2 (un exe + python27.dll): la compilation se déroule sans messages d'erreurs ni warnings mais l'execution du programme (l'exe) plante salement. A savoir pas de prog.exe.log de généré, pas de message dans l'invite de commande si je le lance depuis là mais un bonne vieille fenêtre windows "prog.exe a cessé de fonctionner". That's it.
J'ai remarqué que cela se produit seulement pour certains modules importés dans prog.py. Dans mon cas cela intervient pour les modules:
- PIL.Image et PIL.ImageTk (pas si je fait import PIL seul)
- import scipy.sparse (mais pas import scipy)
Voici mon programme prog.py:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #!/usr/bin/env python
# -*- coding: utf-8 -*-
import Tkinter
import numpy as np
import PIL # WORKS
from PIL import Image # DONT WORKS
#from PIL import ImageTk # DONT WORKS
import threading # WORKS
import Queue # WORKS
import traceback # WORKS
import ttk # WORKS
#from scipy.sparse import bmat # DONT WORKS
data = np.random.random(1)[0]
root = Tkinter.Tk()
label = Tkinter.Label(root, text=str(data))
label.pack(padx=2, pady=2)
root.mainloop() |
Et le setup.py associé:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #!/usr/bin/env python
# -*- coding: utf-8 -*-
from distutils.core import setup
import py2exe
from PIL import Image
# Monkey patch to solve tkinter dll copying issue with py2exe
py2exe.build_exe.py2exe.old_prepare = py2exe.build_exe.py2exe.plat_prepare
def new_prep(self):
self.old_prepare()
from _tkinter import TK_VERSION, TCL_VERSION
self.dlls_in_exedir.append('tcl{0}.dll'.format(TCL_VERSION.replace('.','')))
self.dlls_in_exedir.append('tk{0}.dll'.format(TK_VERSION.replace('.','')))
py2exe.build_exe.py2exe.plat_prepare = new_prep
includes = ['scipy.sparse', 'PIL.Image']
excludes = []
dll_excludes = []
data_files = []
scripts = ['prog.py']
opt = {"py2exe": {"compressed": True,
"optimize": 2,
"includes": includes,
"excludes": excludes,
"dll_excludes": dll_excludes,
"bundle_files": 1,
"dist_dir": "dist",
"xref": False,
"skip_archive": False,
"ascii": False,
"custom_boot_script": '',
}
}
setup(
name = '',
scripts = scripts,
windows = [{'script': 'prog.py'}],
data_files = data_files,
options = opt,
zipfile = None
) |
Notez que j'ai tenté d'inclure manuellement certains modules via l'option "includes".
Est-ce que l'un de vous à déjà rencontré ce soucis? Mes recherches sont infructueuses pour le moment. Je bosse sur Windows7 64bits, python 2.7.6 32bits (Python(X,Y)), PIL 1.1.7.
[EDIT]
Je viens de passer à python 2.7.9 32bits et py2exe 0.6.9 sans aucun changement apparent.
Ciao,
J