mod_wsgi / python sys.path.exend问题

时间:2009-04-18 20:02:06

标签: python apache mod-wsgi

我正在开发一个mod_wsgi脚本..开头是:

sys.path.extend(map(os.path.abspath, ['/media/server/www/webroot/']))

但我注意到,每次更新脚本时,sys.path var都会随着此扩展的重复项而不断增长:

['/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']

每次重启apache都会重置..是否有任何方法可以确保不会发生这种情况?我希望模块路径只加载一次..

3 个答案:

答案 0 :(得分:7)

无需担心自己检查或使用abspath。使用'site'模块的内置addsitedir功能。它会自动处理这些问题和其他问题(例如pth文件):

import site
site.addsitedir('/media/server/www/webroot/')

(此功能仅在Python 2.6中记录,但它几乎总是存在。)

答案 1 :(得分:3)

一个相当简单的方法是在扩展路径之前检查路径是否已经扩展::

path_extension = map(os.path.abspath,['/media/server/www/webroot/']) 
if path_extension[0] not in sys.path:
    sys.path.extend(path_extension)

然而,这有一个缺点,就是在检查是否已经扩展时总是扫描大部分sys.path。更快,但更复杂的版本低于::

path_extension = map(os.path.abspath,['/media/server/www/webroot/']) 
if path_extension[-1] not in reversed(sys.path):
    sys.path.extend(path_extension)

但是,更好的解决方案可能是为PYTHONPATH环境变量添加路径扩展,或者将.pth文件放入site-packages目录:

http://docs.python.org/install/index.html

答案 2 :(得分:2)

mod_wsgi documentation on code reloading涵盖了这一点。