我正在尝试在具有Windows的开发计算机中运行Django应用程序。我已经用virtualenv(不是virtualenvwrapper)成功创建了一个虚拟环境,安装了Django,并用运行python manage.py runserver
的内部服务器加载了它。我相信使用PHP,路径变量等的所有东西都可以。
我还按照https://modwsgi.readthedocs.io/en/develop/的说明成功安装了WSGI,但仅使用全局Python。我已经在virtualenv外部安装了执行以下步骤的mod_wsgi:
set "MOD_WSGI_APACHE_ROOTDIR=C:/wamp64/bin/apache/apache2.4.41"
pip install --upgrade setuptools
pip install mod_wsgi
mod_wsgi-express module-config
然后,将结果行复制到我的httpd.conf中:LoadFile "c:/program files/python35/python35.dll"
LoadModule wsgi_module "c:/program files/python35/lib/site-packages/mod_wsgi/server/mod_wsgi.cp35-win_amd64.pyd"
WSGIPythonHome "c:/program files/python35"
在httpd.conf中创建了一个别名Alias /test/ "C:/wamp64/apps/wsgi_app/"
<Location /test>
SetHandler wsgi-script
Options +ExecCGI
</Location>
<Directory "C:/wamp64/apps/wsgi_app">
Options Indexes FollowSymLinks
Require local
</Directory>
并成功提供了一个wsgi文件:import sys
def application(environ, start_response):
status = '200 OK'
output = u''
output += u'sys.version = %s\n' % repr(sys.version)
output += u'sys.prefix = %s\n' % repr(sys.prefix)
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output.encode('UTF-8')]
它像一个咒语一样工作,表明我在VC版本,Python版本等方面没有问题。当我尝试在虚拟环境中执行相同的操作时,Apache似乎无法加载它。我做了所有类似的事情,从头开始在venv中安装了所有东西。唯一不同的是
mod_wsgi-express module-config
产生不同的结果:LoadModule wsgi_module "c:/wamp64/venv/lib/site-packages/mod_wsgi/server/mod_wsgi.cp35-win_amd64.pyd"
WSGIPythonHome "c:/wamp64/venv"
Apache服务器启动:Apache/2.4.41 (Win64) mod_fcgid/2.3.10-dev mod_wsgi/4.7.1 Python/3.5 PHP/7.3.12 configured -- resuming normal operations
只是要立即崩溃Fatal Python error: Py_Initialize: unable to load the file system codec ImportError: No module named 'encodings'
我尝试使用先前在cmd窗口中激活的venv来启动Apache,而没有事先激活它。看来Apache没有看到或没有激活虚拟环境。该问题发生在任何Django干预之前,我什至无法提供我显示的测试文件。我什至尝试在httpd.conf中添加LoadFile "C:/wamp64/venv/Scripts/python35.dll"
,但无济于事。有什么我想念的吗?任何帮助将不胜感激。
最佳答案
我注意到apache24
和mod_wsgi
的最新版本就是这种情况。一年多以前我没有运行过安装程序,但在过去的几天里,尝试重新安装(使用mod_wsgi 4.7.1
和apache 2.4.46
)一直很麻烦。
问题的一部分似乎是因为大多数核心python模块都是而不是而不是直接在venv
目录下可用(因为virtualenv
不会通过设计将这些文件复制到venv
目录中),所以这些新版本无法以某种方式无法成功找到encodings
模块(可能还有其他模块),因为后者不在venv
下。例如。当您激活虚拟环境并运行时
import encodings
encodings.__file__
您将获得系统范围的python lib目录,在我的情况下为c:/program files/python37/lib/encodings/__init__.py
。尝试改为:
WSGIPythonHome "c:/program files/python37/"
WSGIPythonPath "/path/to/venv/site-packages;path/to/your/app/root/folder"
这为我解决了问题。它类似于this answer,它帮助我更好地了解了我一直在怀疑的内容。关于python - 无法在Apache,WSGI,Django和Windows中加载虚拟环境,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62735467/