Django/Apache/mod#u wsgi不使用virtualenv';s Python二进制文件

Django/Apache/mod#u wsgi不使用virtualenv';s Python二进制文件,python,django,apache,mod-wsgi,wsgi,Python,Django,Apache,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 如

我在/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是实现这一点的方法,但它似乎只影响使用哪个站点包dir,而不影响使用哪个二进制文件。谢谢。

我在一个Pylons应用程序中也遇到了同样的情况,结果使用了
/usr/bin
二进制plusvirtualenv site packages目录


当然是同一个python版本…

如果您使用的是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))

这些是我使用过的说明,似乎效果很好

使用“site.addsitedir()”有点麻烦 与简单地添加 “sys.path”的目录作为 函数将打开任何“.pth”文件 位于目录和进程中 他们。这是必要的,以确保 任何与 Python蛋会自动添加到 “系统路径”

请注意,尽管virtualenv包括 “activate_this.py”脚本 virtualenv文档声明 应使用“execfile()”调用 在mod_wsgi的上下文中,您可以 要谨慎使用它。这是 因为脚本会修改 “sys.prefix”可能会导致 操作系统的问题 mod_wsgi或Python模块已经存在 如果需要,加载到Python解释器中 代码取决于的值 “sys.prefix”未更改。这个 WSGIPythonHome指令已经存在 如果出现以下情况,则应使用描述 希望将Python作为一个整体进行关联 通过虚拟环境

尽管如此,“激活这个.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()'您应该使用 代码:

如果您仍然想使用 来自virtualenv的激活脚本, 然后使用:

如果“sys.prefix”已被 那么,修改没有问题 伟大的如果你看到无法解释的微妙 可能与故障有关的问题 更改为“sys.prefix”,然后使用 以上是更长期的方法 其中使用“site.addsitedir()” 直接和“sys.path”重新排序 后来

这里也有关于这个问题的讨论


在virtualenv中安装modoboa(基于django)时,我遇到了同样的问题

我花了很多时间才找到一个明确的答案,所以我会把它贴在这里

我所需要做的就是在常规apache conf文件中添加两行代码(/etc/httpd/conf/httpd.conf,在CentOS中):


然后重新启动Apache

谢谢,是的,网站可以像那样正常运行……直到它无法正常运行。我正在尝试让东西更便携。谢谢-我以为这会解决问题,但当我回到家尝试时,它实际上没有。当我有一个输入错误(
'opt/webapps/ff',
,缺少第一个斜杠)时,我得到了一个Apache错误,当我修复它时它消失了…所以它被读取了,但它并不影响使用的python二进制文件。谢谢,这实际上并没有解决问题,信不信由你……但当我读到它时,它似乎是一个很好的建议。你能解决这个问题吗?
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 
activate_this = '/usr/local/pythonenv/PYLONS-1/bin/activate_this.py' 
execfile(activate_this, dict(__file__=activate_this))
WSGISocketPrefix /var/run/wsgi ## (location for the PID)
WSGIPythonHome /path/to/virtualenv