virtualenv isolated app 以某种方式找到全局 django 安装而不是本地安装
virtualenv isolated app somehow finds global django installation instead of local one
- 我已经在 (ubuntu + apache + mod_wsgi)
上全局安装了 django v1.8
- 我有一个带有 --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 用户实际上是不可读的。
- 我已经在 (ubuntu + apache + mod_wsgi) 上全局安装了 django v1.8
- 我有一个带有 --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 用户实际上是不可读的。