Bonjour,
je commence à étudier le déploiement d"une application python3 qui fonctionne parfaitement avec l'interpéteur en 3.2.5. j'utilise CX_freeze 4.3.1 pour générer un programme compilé win32.
Mon application est multi-fenêtrée. On sélectionne le nom d'un module ou sous-application que l'on souhaite exécuter dans une liste déroulante et le programme principal le lance. J'utilise le module imp (module) pour générer l'objet classe. Sa description (package, module, classe) est définie dans un fichier de configuration Xml. La fonction get_handler() prend en entrée le noeud xml de configuration et retourne l'instance de classe désirée.
Methode get_handler() :
**info : on considère que le nom du package est identique à son chemin (ce qui est le cas avec ma configuration)
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
|
def get_handler(self, node=None, **parms):
# @param etree.Element node: xml node that must contains the package, module and class tags
# @param dict parms: if node is None parms is a dict {'package':pack_name, 'module':modul_name, 'class':class_name}
if node is not None:
pkg_name = node.find('package').text
module_name = node.find('module').text
class_ = node.find('class').text
else:
# input parms must be set
pkg_name = parms['package']
module_name = parms['module']
class_ = parms['class']
f,p,d = imp.find_module(module_name, [pkg_name])
module = imp.load_module(module_name, f, p, d)
handler = getattr(module, class_)
return(handler) |
Après compilation, le programme principal se lance mais dès que je sélectionne une application rien ne se passe, alors qu'avec la version interprétée la sous-application s'ouvre sans problème (subwindow QT4.9).
Après pas mal de tatonnements je me suis aperçu que c'est dans cette méthode get_handler() que se pose le problème pour le programme compilé.
La ligne suivante ne permet plus de récupérer le file / path / descriptor nécessaire au chargement du module par imp.load_module().
f,p,d = imp.find_module(module_name, [pkg_name])
Je ne suis pas assez pointu pour comprendre ce qui se passe, mais je pense que Cx_freeze qui utilise l'introspection doit se mélanger les pinceaux dès que ce module imp est lui aussi utilisé dans l'application à compiler.
Merci de votre aide.
Partager