mod_wsgi/python sys.path.exend 问题

1 投票
3 回答
1319 浏览
提问于 2025-04-15 11:10

我正在写一个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 个回答

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 文件:

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

7

不用担心自己去检查或者使用绝对路径。可以直接使用‘site’模块里面的内置函数addsitedir。这个函数会自动处理这些问题,还有其他的一些问题(比如.pth文件):

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

(这个函数在Python 2.6的文档中有说明,但其实它几乎一直都存在。)

撰写回答