【问题标题】:Django+Apache+Virtualenv+WSGI(Can not change the primary interpreter)Django+Apache+Virtualenv+WSGI(不能更改主解释器)
【发布时间】:2014-09-28 23:12:27
【问题描述】:

我有带有 python 2.7.3 和任何站点包的 virtualenv。 在此服务器上 - python 2.6.6。我需要 python 2.7.3 作为主解释器

wsgi.py 文件:

import os
import sys
import site


# Add the site-packages of the chosen virtualenv to work with
site.addsitedir('/home/aaodegov/virtual_envs/basic_env_2/lib/python2.7/site-packages')

# Add the app's directory to the PYTHONPATH
sys.path.append('/var/www/mts_report/mts_report_project')
sys.path.append('/var/www/mts_report/mts_report_project/mts_report_project')

os.environ['DJANGO_SETTINGS_MODULE'] = 'mts_report_project.settings.local'

# Activate your virtual env
activate_env="/home/aaodegov/virtual_envs/basic_env_2/bin/activate_this.py"
execfile(activate_env, dict(__file__=activate_env))

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

apache 配置:

<VirtualHost *:80>
        ServerAdmin mail
        ServerName server_name
        ServerAlias alias_name
        DocumentRoot /var/www/mts_report/mts_report_project
        WSGIDaemonProcess mts_report processes=1 maximum-requests=1 threads=1 python-path=/home/aaodegov/virtual_envs/basic_env_2/lib/python2.7:/home/aaodegov/virtual_envs/basic_env_2/lib/python2.7/site-packages
        WSGIProcessGroup mts_report
        WSGIScriptAlias / var/www/mts_report/mts_report_project/wsgi.py

        Alias /static/ /var/www/mts_report/mts_report_project/static/
        Alias /home/aaodegov/virtual_envs/basic_env_2/lib/python2.7/site-packages/admin/media/
        <Directory /var/www/mts_report/mts_report_project>
            Options +Indexes
            allow from all
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/servicescripts_error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/servicescripts_access.log combined
        <Location "/static/">
            Options -Indexes
        </Location>
</VirtualHost>

检查python版本(在调试django模式下):

Python Executable:  /usr/bin/python
Python Version: 2.6.6
Python Path:    
['/home/aaodegov/virtual_envs/basic_env_2/lib/python2.7',
 '/home/aaodegov/virtual_envs/basic_env_2/lib/python2.7/site-packages',
 '/usr/local/lib/python2.6/dist-packages/pip-1.5.6-py2.6.egg',
 '/usr/lib/python2.6',
 '/usr/lib/python2.6/plat-linux2',
 '/usr/lib/python2.6/lib-tk',
 '/usr/lib/python2.6/lib-old',
 '/usr/lib/python2.6/lib-dynload',
 '/usr/local/lib/python2.6/dist-packages',
 '/usr/lib/python2.6/dist-packages',
 '/usr/lib/pymodules/python2.6',
 '/var/www/mts_report/mts_report_project',
 '/var/www/mts_report/mts_report_project/mts_report_project']

因此,Django 使用来自 virtualenv 的站点包,但主解释器 - 来自系统。 如何使用 virtualenv 的解释器(2.7.3)? 谢谢。

【问题讨论】:

    标签: python django apache virtualenv wsgi


    【解决方案1】:

    在 apache config 开头添加

    WSGIPythonHome PATH_TO_YOUR_2.7.3_PYTHON
    
    <VirtualHost *:80>
    ...
    

    请注意,您可能还需要添加类似

    WSGISocketPrefix ../../var/run/wsgi
    

    也改变

    python-path=/home/aaodegov/virtual_envs/basic_env_2/lib/python2.7:/home/aaodegov/virtual_envs/basic_env_2/lib/python2.7/site-packages
    

    python-path=/home/aaodegov/virtual_envs/basic_env_2/lib/python2.7/site-packages
    

    而且你不需要在 wsgi.py 中引用 virtualenv

    【讨论】:

    • 如果 mod_wsgi 是为 Python 2.6 编译的,你不能这样做。您需要安装 mod_wsgi 以便针对 Python 2.7 进行编译。只有这样,您才能使用 Python 2.7 引用特定的 Python 虚拟环境。
    • 是的,我认为 mod_wsgi 是由 Python 2.7 编译的。 Graham 刚刚使用 Python 2.7 编译的 mod_wsgi 足以使用正确版本的 Python。它对我不起作用。我仍然必须使用 WSGIPythonHome PATH_TO_YOUR_2.7.3_PYTHON。我有几个 Python 安装和 Python 33 + Apache 2.2
    • 如果 Python 2.7 安装在非标准位置,例如 /usr/local,那么是的,您仍然需要设置 WSGIPythonHome,否则它将回退到使用 /usr 作为前缀,因为它会发现 / usr/bin/python。翻译有点傻。 “python”可执行文件不用于嵌入式系统,但它使用它作为参考点来确定前缀和 lib 目录的位置。
    • 谢谢格雷厄姆。是的,我从 /opt/ 安装了所有 Python。不确定 Sasha 的 Python 安装在哪里。我假设他在 /usr/ 其他地方有 Python,他的问题与我的类似。
    • 他们的主要问题是它显示 Python 版本无论如何都是 2.6。必须先解决这个问题。
    【解决方案2】:

    昨天问题解决了。 对遇到类似问题的人有用。 mod_vsgi 不是为 python 2.7 编译的。 谢谢大家的回答。

    首先,安装 apache2-threaded-dev 然后,使用 --enable-shared 编译 PYTHON。这很重要。

    ./configure --enable-shared --prefix=/usr/local/python-2.7.3
    make
    make install
    ln -s /usr/local/python-2.7.3/bin/python2.7 /usr/bin/python2.7.3
    

    找不到libpython2.7.so.1.0问题:

    ln -s /usr/local/python-2.7.3/lib/libpython2.7.so.1.0 /usr/lib/
    ln -s /usr/local/python-2.7.3/lib/libpython2.7.so /usr/
    

    用python2.7.3编译MOD_WSGI

    ./configure --with-python=/usr/bin/python2.7.3
    make
    make install
    

    重启apache:

    service apache2 restart
    

    【讨论】: