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

时间:2011-04-27 07:07:14

标签: 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

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

4 个答案:

答案 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