virtualenv isolated app 以某种方式找到全局 django 安装而不是本地安装

virtualenv isolated app somehow finds global django installation instead of local one

  1. 我已经在 (ubuntu + apache + mod_wsgi)
  2. 上全局安装了 django v1.8
  3. 我有一个带有 --no-site-packages 的 virtualenv 'myenv'(这意味着它与全局包隔离),其中安装了 django 1.9

这是我的应用程序的 apache 配置

WSGIPythonPath /var/djp/myapp:/root/.virtualenvs/myapp/lib/python2.7/site-packages

<VirtualHost *:80>

    WSGIDaemonProcess mydomain.com python-path=/var/djp/myapp:/root/.virtualenvs/myenv/lib/python2.7/site-packages
    WSGIProcessGroup mydomain.com
    WSGIPassAuthorization On

    WSGIScriptAlias / /var/djp/myapp/myapp/wsgi.py
    ServerName mydomain.com
    ServerAlias *.mydomain.com
    ErrorLog ${APACHE_LOG_DIR}/myapp/myapp_error.log
    LogLevel info

</VirtualHost>

如果我切换到 myenv 并在 python 中检查版本,我得到

>>> import django
>>> django.VERSION
(1, 9, 7, 'final', 0)
>>> import sys
>>> print sys.path 
*the path is ok*

但是如果我打开我的应用程序网页,我会看到以下内容

Django Version: 1.8.3

Python Executable:  /usr/bin/python
Python Version: 2.7.3
Python Path:    
['/var/djp/myapp', # - ok
 '/root/.virtualenvs/myenv/lib/python2.7/site-packages', # - ok
 '/usr/lib/python2.7', # - not ok (global)
 '/usr/lib/python2.7/plat-linux2', # - not ok (global)
 '/usr/lib/python2.7/lib-tk', # - not ok (global)
 '/usr/lib/python2.7/lib-old', # - not ok (global)
 '/usr/lib/python2.7/lib-dynload', # - not ok (global)
 '/usr/local/lib/python2.7/dist-packages', # - not ok (global)
 '/usr/lib/python2.7/dist-packages', # - not ok (global)
 '/usr/lib/python2.7/dist-packages/PIL', # - not ok (global)
 '/usr/lib/pymodules/python2.7'] 

我就是不明白,为什么它先执行django 1.8?应该首先找到我的本地站点包。我的第一个想法是,python 在 myenv 中找不到 django 1.9。但我可以轻松地从 python shell 导入它,如上所示!

这是 myenv 中 pip freeze 的输出:

Django==1.9.7
argparse==1.2.1
distribute==0.6.24
django-crispy-forms==1.6.0
djangorestframework==3.3.3
psycopg2==2.6.1
wsgiref==0.1.2

一切都在它的地方。我不知道会发生什么。请帮助

尝试:

WSGIRestrictEmbedded On

<VirtualHost *:80>

    WSGIDaemonProcess mydomain.com python-home=/root/.virtualenvs/myenv python-path=/var/djp/myapp
    WSGIProcessGroup mydomain.com
    WSGIPassAuthorization On

    WSGIScriptAlias / /var/djp/myapp/myapp/wsgi.py
    ServerName mydomain.com
    ServerAlias *.mydomain.com
    ErrorLog ${APACHE_LOG_DIR}/myapp/myapp_error.log
    LogLevel info

</VirtualHost>

也就是说,在嵌入式模式进程中关闭解释器初始化,然后使用python-home选项来说明虚拟环境在哪里。

剩下的问题是您是否使用非系统Python安装。如果你是并且 mod_wsgi 实际上是为系统 Python 而不是你单独的系统编译的,则需要做更多的工作。

另一个问题可能是 /root 目录对于 Apache 用户实际上是不可读的。