我在/ 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目录,而不是使用哪个二进制文件。感谢。
答案 0 :(得分:8)
这些是我使用的说明似乎运作良好的说明。
http://code.google.com/p/modwsgi/wiki/VirtualEnvironments
使用'site.addsitedir()'有点 不同于简单地添加 目录以'sys.path'为 函数将打开任何'.pth'文件 位于目录和进程中 他们。这是确保这一点所必需的 与...有关的任何特殊目录 Python鸡蛋会自动添加到 '的sys.path'。
请注意,虽然virtualenv包括 脚本'activate_this.py',其中 virtualenv文件声称 应该使用'execfile()'来调用 在mod_wsgi的上下文中,您可以 想要谨慎使用它。这是 因为脚本修改了 'sys.prefix'实际上可能导致 操作问题 mod_wsgi或Python模块已经 如果加载到Python解释器中 代码取决于的值 'sys.prefix'没有变化。该 已经有WSGIPythonHome指令 如果描述应该使用 想要将Python作为一个整体来关联 与虚拟环境。
尽管如此,'activate_this.py' 脚本是尝试解决问题 问题'site.addsitedir()' 作品。那是任何新的 添加到的目录 'site.addsitedir()'的'sys.path'是 实际上附加到最后。该 在上下文中的问题 mod_wsgi就是WSGIPythonHome 不习惯将mod_wsgi与a关联 处女基线环境,然后任何 主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
如果你还想使用 来自virtualenv的激活脚本, 然后使用:
activate_this = '/usr/local/pythonenv/PYLONS-1/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
如果'sys.prefix'已经存在的事实 那么修改后不会出问题 大。如果你看到细微的原因不明 可能与之相关的问题 更改为'sys.prefix',然后使用 上面更长远的方法 使用'site.addsitedir()' 直接和'sys.path'重新排序 随后
以下是关于此问题的讨论
http://groups.google.com/group/modwsgi/browse_thread/thread/466823f087070b5f?pli=1
答案 1 :(得分:2)
我在Pylons应用中遇到了相同的情况,最后使用/usr/bin
二进制加 virtualenv site-packages目录。
当然它是相同的python版本......
答案 2 :(得分:2)
如果您使用的是virtualenv,则需要确保在WSGI脚本中激活它。
venv_path = "/opt/webapps/ff"
activate_this = os.path.join(venv_path, "bin/activate_this.py")
execfile(activate_this, dict(__file__=activate_this))
答案 3 :(得分:0)
I have encountered the same issue when installing modoboa (django based) in virtualenv.
It took me a lot of time to find a clear answer, so I will post it here.
All I needed to do was adding two lines to the general apache conf file (/etc/httpd/conf/httpd.conf in CentOS):
WSGISocketPrefix /var/run/wsgi ## (location for the PID)
WSGIPythonHome /path/to/virtualenv
And restart Apache