mod_wsgi/python sys.path.exend 问题
我正在写一个mod_wsgi的脚本,开头部分是:
sys.path.extend(map(os.path.abspath, ['/media/server/www/webroot/']))
但是我发现,每次我更新这个脚本的时候,sys.path这个变量里会不断增加这个扩展的重复项:
['/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 个回答
2
mod_wsgi的文档里有关于代码重新加载的说明。
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
环境变量中,或者在你的 site-packages
目录里放一个 .pth
文件:
7
不用担心自己去检查或者使用绝对路径。可以直接使用‘site’模块里面的内置函数addsitedir。这个函数会自动处理这些问题,还有其他的一些问题(比如.pth文件):
import site
site.addsitedir('/media/server/www/webroot/')
(这个函数在Python 2.6的文档中有说明,但其实它几乎一直都存在。)