Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Apache无法正确加载virtualenv:“0”;ImportError:没有名为';psycopg2._psycopg'&引用;_Django_Apache_Python 3.x_Ubuntu 14.04_Virtualenv - Fatal编程技术网

Django Apache无法正确加载virtualenv:“0”;ImportError:没有名为';psycopg2._psycopg'&引用;

Django Apache无法正确加载virtualenv:“0”;ImportError:没有名为';psycopg2._psycopg'&引用;,django,apache,python-3.x,ubuntu-14.04,virtualenv,Django,Apache,Python 3.x,Ubuntu 14.04,Virtualenv,我将Django项目从Python2.7迁移到Python3.6 从那时起,我无法启动并运行我的项目,因为Apache抱怨如下(重新启动后完全输出): 我正在使用WSGI。其文件内容如下: import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_a

我将Django项目从Python2.7迁移到Python3.6

从那时起,我无法启动并运行我的项目,因为Apache抱怨如下(重新启动后完全输出):

我正在使用WSGI。其文件内容如下:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
我的主要Apache2站点配置如下(还有一个管理员/管理员部分):

出什么事了


我使用的是Ubuntu14.04 LTS。

我在Debian 8机器上使用Python3.6、Apache2.4和WSGI运行Django 1.11应用程序时遇到了完全相同的问题

问题是
libapache2 mod wsgi py
是为
apache2
python
的特定版本编译的,它与不同的
python
版本不兼容。 当然,

  • libapache2 mod wsgi py
    用于python 2.7
  • libapache2-mod-wsgi-py3
    ——对于python3
但次要的python版本也很重要

让我看看。在@SaeX stacktrace中,大多数行都是关于您的Python 3.6venv的

...
File "/home/myuser/.virtualenvs/myproject-3.6/lib/python3.6/site-packages/django/apps/config.py", line 116, in create
...
但是Python 3.4调用中有一行

...
File "/usr/lib/python3.4/importlib/__init__.py", line 109, in import_module
...
我假设在他的操作系统存储库(当时)中,
apt-get-install-python3
提供的最新
python3
版本是
3.4.n
,而
apt-get-install-libapache2-mod-wsgi-py3
的结果是为Python 3.4编译的。这就是原因


在我的情况下,我首先在stacktrace中捕获了
python2.7

File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module'
这意味着我尝试使用
libapache2 mod wsgi py
而不是
libapache2-mod-wsgi-py3
。但是当我安装
libapache2-mod-wsgi-py3
时,我在stacktrace中得到了
python3.5

File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module'

我用两种方法解决了这个问题,两种方法对我来说都没问题:

  • 使用操作系统软件包存储库中提供的最新
    python3
    版本
  • python3.6
  • 1。最新系统Python 3

    @SaeX是这样使用的:


    谢谢,;将我的venv降级到Python 3.4修复了这个问题

    在您的情况下,最新的Python3版本可能会有所不同

    apt-get update
    apt-get install python3 python3-venv
    
    # check python3 version
    python3 -V
    # >>> Python 3.5.4 is for my Debian 8 in September 2017
    
    # setting virtual environment for WSGI
    python3 -m venv /home/pyvenv_354
    source /home/pyvenv_354/bin/activate
    # check venv and get path for WSGI
    (pyvenv_354) python -c 'import sys; print(sys.prefix)'
    # >>> /home/pyvenv_354
    
    # mod_wsgi from repo must be compatible
    apt install libapache2-mod-wsgi-py3
    
    现在这个
    python3.5
    venv可以在
    apache2

    # sites-available/mysite.conf
    ...
    Define WWW_ROOT /var/www/mysite/mysite
    ...
    Define PYTHON_VENV_HOME /home/pyvenv_354
    Define PYTHON_VENV_PACKAGES ${PYTHON_VENV_HOME}/lib/python3.5/site-packages
    WSGIDaemonProcess mysite processes=2 python-path=${WWW_ROOT}:${PYTHON_VENV_PACKAGES}
    WSGIProcessGroup mysite
    WSGIScriptAlias / ${MAIN_APP_PATH}/wsgi.py
    
    # sites-available/mysite.conf
    ...
    Define WWW_ROOT /var/www/mysite/mysite
    ...
    Define PYTHON_VENV_HOME /home/pyvenv_362
    Define PYTHON_VENV_PACKAGES ${PYTHON_VENV_HOME}/lib/python3.6/site-packages
    WSGIDaemonProcess mysite processes=2 python-path=${WWW_ROOT}:${PYTHON_VENV_PACKAGES}
    WSGIProcessGroup mysite
    WSGIScriptAlias / ${MAIN_APP_PATH}/wsgi.py
    
    最后使用您最喜欢的方式重新启动Apache2,例如

    service apache2 restart
    
    service apache2 restart
    
    2。为Python 3.6构建
    mod_wsgi

    我过去经常表演。 注意:
    apache2开发
    python开发
    软件包是必需的

    apt-get install python3.6 python3.6-dev apache2-dev
    # checking Python version
    python3.6 -V
    # >>> 3.6.2
    
    # set virtual environment
    python3.6 -m venv /home/pyvenv_362
    
    # download mod_wsgi sources from https://github.com/GrahamDumpleton/mod_wsgi/releases
    # x, y, z --- version, select using link above
    cd /usr/src/
    wget https://github.com/GrahamDumpleton/mod_wsgi/archive/x.y.z.tar.gz
    tar xvfz x.y.z.tar.gz
    cd mod_wsgi-x.y.z
    
    # set python3.6 venv for mod_wsgi
    ./configure --with-python=/home/pyvenv_362/bin/python
    
    make
    make install
    
    # >>> Libraries have been installed in:
    #   /usr/lib/apache2/modules
    #   mod_wsgi.so
    
    # adding module to apache2
    cat /etc/apache2/mods-enabled/wsgi.load
    nano /etc/apache2/httpd.conf
    add to httpd.conf line `LoadModule wsgi_module modules/mod_wsgi.so`
    
    现在,
    python3.6
    venv可以在
    apache2

    # sites-available/mysite.conf
    ...
    Define WWW_ROOT /var/www/mysite/mysite
    ...
    Define PYTHON_VENV_HOME /home/pyvenv_354
    Define PYTHON_VENV_PACKAGES ${PYTHON_VENV_HOME}/lib/python3.5/site-packages
    WSGIDaemonProcess mysite processes=2 python-path=${WWW_ROOT}:${PYTHON_VENV_PACKAGES}
    WSGIProcessGroup mysite
    WSGIScriptAlias / ${MAIN_APP_PATH}/wsgi.py
    
    # sites-available/mysite.conf
    ...
    Define WWW_ROOT /var/www/mysite/mysite
    ...
    Define PYTHON_VENV_HOME /home/pyvenv_362
    Define PYTHON_VENV_PACKAGES ${PYTHON_VENV_HOME}/lib/python3.6/site-packages
    WSGIDaemonProcess mysite processes=2 python-path=${WWW_ROOT}:${PYTHON_VENV_PACKAGES}
    WSGIProcessGroup mysite
    WSGIScriptAlias / ${MAIN_APP_PATH}/wsgi.py
    
    最后使用您最喜欢的方式重新启动Apache2,例如

    service apache2 restart
    
    service apache2 restart
    

    请阅读文档中的警告,其中说明不能强制为一个Python版本编译的mod_wsgi使用基于不同Python版本的Python虚拟环境。换句话说,您必须为Python3.6安装mod_wsgi。您的mod_wsgi是为Python 3.4构建的。该文档还告诉您如何正确指定要使用的虚拟环境。你怎么做不是推荐的方法。谢谢;将我的venv降级到Python 3.4修复了这个问题。强烈建议:迁移到nginx+gunicorn