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目录,而不是使用哪个二进制文件.谢谢.
这些是我使用的说明似乎运作良好.
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
我在 Pylons 应用程序中遇到了同样的情况,最终使用/usr/bin二进制加virtualenv site-packages dir 代替。
当然是同一个Python版本......
| 归档时间: |
|
| 查看次数: |
5874 次 |
| 最近记录: |