我正在Windows 10上运行Python 3.7.1和Apache 2.4.38。我已经建立了一个虚拟环境,其中包含通过“ pip”安装的Django 2.2.5和mod_wsgi 4.6.5。在“ httpd.conf”中,按照一些说明,我已将WSGIPythonHome设置为指向虚拟环境的根目录。但是,当我启动Apache时,它失败并显示:“没有名为'encodings'的模块”。 Apache似乎需要访问系统范围的Python。
我在以下位置找到了系统级的Python:“ C:\ Program Files \ Python3.7.1”。 虚拟环境位于:“ D:\ PROJ \ PYTHON \ VEnv \ django”。
这是我添加到“ httpd.conf”中的内容:
LoadModule wsgi_module "D:/PROJ/PYTHON/VEnv/django/Lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"
WSGIScriptAlias / "D:/PROJ/PYTHON/VEnv/django/Shipkaliev/wsgi.py"
WSGIPythonHome "D:/PROJ/PYTHON/VEnv/django"
WSGIPythonPath "D:/PROJ/PYTHON/VEnv/django/Shipkaliev"
<Directory "D:/PROJ/PYTHON/VEnv/django/Shipkaliev">
<Files wsgi.py>
Require all granted
</Files>
</Directory>
根据https://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html和https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/modwsgi/,这是需要设置的方式。
因此,通过这种配置,Apache无法找到虚拟环境中不存在的所有本机Python模块,例如“编码”,“编解码器”,“ io”等。
当我注释掉“ WSGIPythonHome”指令时,Apache初始化了Python,但是如果我尝试在“ wsgi.py”脚本中导入Django,它将找不到它。
一切正常的方法是,当我更改“ WSGIPythonHome”以指向系统范围的Python并将虚拟环境的“站点包”添加到路径时:
WSGIPythonHome "C:/Program Files/Python3.7.1"
WSGIPythonPath "D:/PROJ/PYTHON/VEnv/django/Lib/site-packages;D:/PROJ/PYTHON/VEnv/django/Shipkaliev"
但这不是它的预期工作方式。 “ WSGIPythonHome”的意义是什么?难道我做错了什么?我的解决方案可以接受吗?
非常感谢您!
答案 0 :(得分:0)
我找到了!由于“ D:/ PROJ / PYTHON / VEnv / django”是虚拟环境的根,因此无法在此处找到Python标准库。标准库位于“ C:/ Program Files / Python3.7.1 / Lib”中。这就是为什么:“没有名为“编码”的模块”。
“ WSGIPythonHome-用来在初始化时向Python指示其库文件的安装位置。...使用此伪指令时,应为包含平台独立和系统依赖的Python库文件的目录提供前缀。 ” -感谢:https://code.google.com/archive/p/modwsgi/wikis/ConfigurationDirectives.wiki#WSGIPythonHome
这是我最后的Apache conf:
LoadModule wsgi_module "D:/PROJ/PYTHON/VEnv/django/Lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"
WSGIScriptAlias / "D:/PROJ/PYTHON/VEnv/django/Shipkaliev/wsgi.py"
WSGIPythonHome "D:/PROJ/PYTHON/VEnv/django;C:/Program Files/Python3.7.1"
WSGIPythonPath "D:/PROJ/PYTHON/VEnv/django/Lib/site-packages;D:/PROJ/PYTHON/VEnv/django/Shipkaliev"
<Directory "D:/PROJ/PYTHON/VEnv/django/Shipkaliev">
<Files wsgi.py>
Require all granted
</Files>
</Directory>
在Django和mod_wsgi文档中都不清楚。希望对您有所帮助。
答案 1 :(得分:0)
实际上,出现了漏洞问题,因为我最初使用的虚拟环境(对于Django)是使用Stdlib的“ venv”创建的。但是,当我使用“ virtualenv”创建一个时,一切都非常好,并且“ httpd.conf”的初始配置可以正常工作。
在“ Lib”目录中的“ venv”环境中(Windows),您只有“ site-packages”和“ tcl ...”目录。因此,“ venv”环境依赖于使用它创建的Python的Standard库。
其中:“'virtualenv'是用于创建隔离的”(和独立)“ Python环境的工具。...它创建了一个具有自己的安装环境。目录,不与其他virtualenv环境共享库”,并且(默认情况下)也可以选择不访问全局安装的库。在“ Lib”目录中的“ virtualenv”虚拟环境中,您拥有整个标准库!
这就是为什么这次将“ WSGIPythonHome”设置为虚拟环境的根目录(使用“ virtualenv”)的原因,因为Apache现在可以在该虚拟环境中找到“编码”,“编解码器”以及所有其他Stdlib环境!
我很确定我的小障碍会让别人更了解情况。 :)