Comment puis-je utiliser des modules dans web2py?

j'ai quelques fonctions func.py que je voudrais accéder à partir de mon contrôleur web2py appelé default.py. J'ai essayé d'importer et d'utiliser func.pydefault.py avec "import func" et " calculatesomething = func.calculatesomething", mais ça ne fonctionne pas. Le fichier func.py est également ajouté dans la section Modules de mon web2py programme.

pourquoi ça ne marche pas? Comment puis-je faire? Si le module doit être dans func.py ou default/func.py ou autre chose?

19
demandé sur Alexey Gorozhanov 2011-01-11 15:14:18

2 réponses

func doit être dans un endroit qui est dans PYTHONPATH (sys.chemin d'accès) tel que web2py/site-packages. C'est la bonne façon pythonique de le faire.

Si au contraire, vous voulez package de votre module avec votre application, puis le placer dans applications/yourapp/modules, ensuite, vous devez l'importer avec func = local_import('func')

Q: les personnes qui sont nouvelles à web2py peuvent se demander: Pourquoi utiliser local_import() quand la première méthode est la méthode standard dans le monde Python?

A: Parce que dans web2py vous pouvez installer de nouvelles applications sans redémarrer le serveur. Les applications ne peuvent pas changer sys.path parce qu'il n'est pas sécurisé et dépend de l'ordre dans lequel ces applications sont installées. De plus, deux applications peuvent nécessiter des modules avec le même nom mais différents (par exemple, des versions différentes). Nous voulons éviter les conflits entre ces modules et d'autres qui peuvent être préinstallés.

local_import() est une solution de contournement qui permet d'expédier certains modules avec vos applications et de les importer sans ajouter le dossier sys.path et provoquant des conflits de version.

27
répondu Massimo 2011-12-26 13:58:35

Juste pour ajouter un peu de user570039 réponse, local_import est documenté ici. Il comprend un reload paramètre. Selon la documentation:

quand vous spécifiezreload=True, il réimporte le module à chaque demande; sinon, votre processus python n'importera le module qu'une seule fois. La valeur par défaut estreload=False.

en développement, réglage reload=True peut être pratique parce que les changements à votre module fonctionneront immédiatement sans nécessitant un redémarrage. Cependant, ré-importer à chaque demande ralentira les performances, donc reload=False est recommandé en production.


mise à jour: les Choses ont changé. local_import a été dépréciées. Si vous avez /applications/myapp/modules/mymodule.py, vous pouvez l'importer dans myapp en faisant:

import mymodule

web2py vérifiera le dossier "modules" de l'application avant de vérifier le reste de sys.chemin.

Pour plus de détails, voir ici.

34
répondu Anthony 2012-04-30 17:33:42