Les problèmes de mod_wsgi / python
Question
Je travaille sur un script mod_wsgi .. au début est:
sys.path.extend(map(os.path.abspath, ['/media/server/www/webroot/']))
Mais je l'ai remarqué, que chaque fois que je mets à jour le script du var sys.path ne cesse de croître avec les doublons de cette extension:
['/usr/lib64/python25.zip'
'/usr/lib64/python2.5'
'/usr/lib64/python2.5/plat-linux2'
'/usr/lib64/python2.5/lib-tk'
'/usr/lib64/python2.5/lib-dynload'
'/usr/lib64/python2.5/site-packages'
'/usr/lib64/python2.5/site-packages/Numeric'
'/usr/lib64/python2.5/site-packages/gtk-2.0'
'/usr/lib64/python2.5/site-packages/scim-0.1'
'/usr/lib/python2.5/site-packages'
'/media/server/www/webroot'
'/media/server/www/webroot'
'/media/server/www/webroot'
'/media/server/www/webroot']
Il remet à zéro chaque fois que je redémarre apache .. est-il un moyen pour vous assurer que cela ne se produit pas? Je veux que le chemin du module à charger une seule fois ..
La solution
Pas besoin de vous soucier de vérifier ou d'utiliser abspath vous. Utilisez le du module « site » intégré addsitedir fonction. Il prendra soin de ces questions et d'autres (par exemple automatiquement les fichiers ièmes.):
import site
site.addsitedir('/media/server/www/webroot/')
(Cette fonction est uniquement documentée dans Python 2.6, mais il a à peu près toujours existé.)
Autres conseils
Une façon assez simple à faire est de vérifier si le chemin a déjà été étendue avant de l'étendre ::
path_extension = map(os.path.abspath,['/media/server/www/webroot/'])
if path_extension[0] not in sys.path:
sys.path.extend(path_extension)
Ceci a l'inconvénient, cependant, de balayer toujours par la plupart des sys.path
lors de la vérification pour voir si elle a été prolongée. Un moyen plus rapide, bien plus complexe, version ci-dessous ::
path_extension = map(os.path.abspath,['/media/server/www/webroot/'])
if path_extension[-1] not in reversed(sys.path):
sys.path.extend(path_extension)
Une meilleure solution, cependant, est probablement soit ajouter le chemin des extensions à votre variable d'environnement PYTHONPATH
ou mettre un fichier .pth
dans votre répertoire site-packages
:
Le documentation sur le code rechargeant couvre cela.