Django/Apache/mod_wsgi没有使用virtualenv的Python二进制文件

rfr*_*kel 6 python apache django mod-wsgi wsgi

我在/ opt/webapps/ff /上有一个virtualenv,它有自己的Python安装.我在我的Apache配置文件中将WSGIPythonHome设置为/ opt/webapps/ff(这肯定会在某些容量中使用,因为如果我将它设置为稍微不同的现有目录并重新启动Apache,我会得到504).但是,如果我assert False在一个视图中某处调出Django调试页面,我会看到settings.PYTHON_BIN /usr/bin而不是/opt/webapps/ff/bin.

如何让Apache/mod_wsgi使用我的虚拟环境的Python二进制文件?我认为设置WSGIPythonHome是这样做的方法,但它似乎只影响使用哪个site-packages目录,而不是使用哪个二进制文件.谢谢.

DTi*_*ing 8

这些是我使用的说明似乎运作良好.

http://code.google.com/p/modwsgi/wiki/VirtualEnvironments

使用'site.addsitedir()'与简单地将目录添加到'sys.path'有点不同,因为该函数将打开位于目录中的任何'.pth'文件并处理它们.这是确保将与Python egg相关的任何特殊目录自动添加到"sys.path"所必需的.

请注意,虽然virtualenv包含脚本'activate_this.py',virtualenv文档声称应该在mod_wsgi的上下文中使用'execfile()'调用,但您可能需要谨慎使用它.这是因为脚本修改了'sys.prefix',如果代码依赖于'sys.prefix'的值没有改变,它实际上可能导致mod_wsgi或已经加载到Python解释器中的Python模块的操作出现问题.如果想要将Python作为一个整体与虚拟环境相关联,则应该使用已经描述的WSGIPythonHome指令.

尽管如此,'activate_this.py'脚本试图解决'site.addsitedir()'如何工作的问题.也就是说,'site.addsitedir()'添加到'sys.path'的任何新目录实际上都附加到了结尾.在mod_wsgi的上下文中,这个问题是如果WSGIPythonHome没有用于将mod_wsgi与原始基线环境相关联,那么主Python安装中的任何包/模块仍将优先于虚拟环境中的那些.

要解决这个问题,'activate_this.py'所做的是调用'site.addsitedir()',然后重新排序'sys.path',这样任何新添加的目录都会转移到'sys.path'的前面.这将确保在虚拟环境中存在不同版本的软件包时,它们优先于主Python安装中的软件包.

正如所解释的那样,因为'activate_this.py'在mod_wsgi的上下文中执行其他可能不合适的事情,如果无法将WSGIPythonHome设置为在原始基线环境中指向mod_wsgi,而不是仅仅调用'site.addsitedir()'你应该使用代码:

ALLDIRS = ['usr/local/pythonenv/PYLONS-1/lib/python2.5/site-packages']

import sys 
import site 

# Remember original sys.path.
prev_sys_path = list(sys.path) 

# Add each new site-packages directory.
for directory in ALLDIRS:
  site.addsitedir(directory)

# Reorder sys.path so new directories at the front.
new_sys_path = [] 
for item in list(sys.path): 
    if item not in prev_sys_path: 
        new_sys_path.append(item) 
        sys.path.remove(item) 
sys.path[:0] = new_sys_path 
Run Code Online (Sandbox Code Playgroud)

如果您仍想使用virtualenv中的激活脚本,请使用:

activate_this = '/usr/local/pythonenv/PYLONS-1/bin/activate_this.py' 
execfile(activate_this, dict(__file__=activate_this))
Run Code Online (Sandbox Code Playgroud)

如果'sys.prefix'被修改的事实没有给出问题,那么很好.如果你看到可能与'sys.prefix'的更改有关的细微的无法解释的问题,那么使用上面更长的方法,直接使用'site.addsitedir()',然后重新排序'sys.path'.

以下是对此问题的讨论

http://groups.google.com/group/modwsgi/browse_thread/thread/466823f087070b5f?pli=1


neu*_*ino 2

我在 Pylons 应用程序中遇到了同样的情况,最终使用/usr/bin二进制virtualenv site-packages dir 代替。

当然是同一个Python版本......