Django Apache无法正确加载virtualenv:“0”;ImportError:没有名为';psycopg2._psycopg'&引用;
我将Django项目从Python2.7迁移到Python3.6 从那时起,我无法启动并运行我的项目,因为Apache抱怨如下(重新启动后完全输出): 我正在使用WSGI。其文件内容如下: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
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
版本不兼容。
当然,
用于python 2.7libapache2 mod wsgi py
——对于python3libapache2-mod-wsgi-py3
...
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
谢谢,;将我的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