2010-08-19 5 views
2

J'ai une application Python qui charge les modules python dynamiquement au moment de l'exécution (en utilisant __import__). Les modules à charger sont dans un paquet appelé 'plugins' (c'est-à-dire sous-dossier appelé plugins avec __init__.py etc.). Tout fonctionne correctement depuis l'interpréteur python, et même lorsqu'il est compilé dans un binaire Windows en utilisant py2exe.py2app: comment inclure les modules qui seront chargés par __import__?

J'ai essayé de construire une application OSX, qui a réussi, mais lors de l'exécution du fichier .app, j'obtiens une erreur ImportError: 'no module named plugins.xxxx'.

Je suis assez sûr que j'ai donné les bonnes options à py2app ('includes': [...], 'packages':['plugins'], identiques à ce que je fais pour py2exe), depuis quand je parcourir le contenu .app, je vois tous les modules d'extension dans un dossier Contents/Resources/lib/python2.5/plugins/. Donc, pourquoi l'application ne trouve-t-elle pas mes modules (il doit y avoir un problème de chemin)?

Edit:

Je l'ai trouvé un moyen de le faire fonctionner, mais ce n'est pas une bonne solution: Quand je les chemins Python imprimé recherche les modules (en utilisant print sys.path), je remarquai que le dossier Contents/Resources/lib/python2.5/plugins/ n'a PAS été répertorié. Cependant, le dossier Contents/Resources/ est, alors j'ai déplacé le dossier plugins vers le dossier Contents/Resources. Maintenant, les plugins sont trouvés. Mais je ne suis toujours pas heureux avec ce hack manuel et laid.

Répondre

0

Koo utilise le code suivant. Vous devrez probablement faire quelque chose de similaire pour détecter que vous êtes dans py2app, et ajuster votre importation en conséquence.

http://bazaar.launchpad.net/~openobject-client-kde/openobject-client-kde/5.0/annotate/head%3A/Koo/Common/Plugins.py

def scan(module, directory): 
     pluginImports = __import__(module, globals(), locals()) 
     # Check if it's being run using py2exe or py2app environment 
     frozen = getattr(sys, 'frozen', None) 
     if frozen == 'macosx_app' or hasattr(pluginImports, '__loader__'): 
       # If it's run using py2exe or py2app environment, all files will be in a single 
       # zip file and we can't use listdir() to find all available plugins. 
       zipFiles = pluginImports.__loader__._files 
       moduleDir = os.sep.join(module.split('.')) 
       files = [zipFiles[file][0] for file in zipFiles.keys() if moduleDir in file] 
       files = [file for file in files if '__init__.py' in file] 
       for file in files: 
         d = os.path.dirname(file) 
         if d.endswith(moduleDir): 
           continue 
         newModule = os.path.basename(os.path.dirname(file)) 
         __import__('%s.%s' % (module, newModule), globals(), locals(), [newModule]) 
     else: 
       for i in os.listdir(directory): 
         path = os.path.join(directory, i, '__init__.py') 
         if os.path.isfile(path): 
           __import__('%s.%s' % (module, i), globals(), locals(), [i]) 
Questions connexes