【问题标题】:mod_wsgi/python sys.path.exend problemsmod_wsgi/python sys.path.exend 问题
【发布时间】:2009-04-18 20:02:05
【问题描述】:

我正在编写一个 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 时它都会重置。有没有办法确保不会发生这种情况?我希望模块路径只加载一次..

【问题讨论】:

    标签: python apache mod-wsgi


    【解决方案1】:

    无需担心自己检查或使用 abspath。使用“站点”模块的内置addsitedir 函数。它将自动处理这些问题和其他问题(例如 pth 文件):

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

    (此函数仅在 Python 2.6 中记录,但几乎一直存在。)

    【讨论】:

      【解决方案2】:

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

      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

      【讨论】:

      • +1 .pth 文件很棒。从 apache config 设置的环境变量也是如此。
      【解决方案3】:

      mod_wsgi documentation on code reloading 涵盖了这个。

      【讨论】:

        猜你喜欢
        • 2015-04-17
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 2011-07-29
        • 1970-01-01
        • 1970-01-01
        • 2013-08-11
        相关资源
        最近更新 更多