Django Apache error: No module named 'encodings'. Windows server 2008 R2 Standard
Django Apache error: No module named 'encodings'. Windows server 2008 R2 Standard
我从 git 克隆了 repo。我创建了 venv:
python -m venv myenv
/myenv/scripts/activate.bat
pip install -r requirements.txt
pip install mod_wsgi-4.6.5+ap24vc14-cp36-cp36m-win_amd64.whl
如果我 运行 来自 myvenv 那:
python manage.py runserver
成功了!
如果我从 apache 运行,我有一个错误:
[Wed Oct 30 10:51:18.732028 2019] [mpm_winnt:notice] [pid 352:tid 168] AH00455: Apache/2.4.41 (Win64) mod_wsgi/4.6.5 Python/3.6 configured -- resuming normal operations
[Wed Oct 30 10:51:18.732028 2019] [mpm_winnt:notice] [pid 352:tid 168] AH00456: Apache Lounge VS16 Server built: Aug 9 2019 16:46:32
[Wed Oct 30 10:51:18.732028 2019] [core:notice] [pid 352:tid 168] AH00094: Command line: 'httpd -d C:/Apache24'
[Wed Oct 30 10:51:18.732028 2019] [mpm_winnt:notice] [pid 352:tid 168] AH00418: Parent: Created child process 1748
Fatal Python error: Py_Initialize: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'
Current thread 0x00000354 (most recent call first):
[Wed Oct 30 10:51:23.677228 2019] [mpm_winnt:crit] [pid 352:tid 168] AH00419: master_main: create child process failed. Exiting.
低于httpd.conf:
LoadFile "c:/<>/python/python36/python36.dll"
LoadModule wsgi_module "c:/envs/myproject/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd"
WSGIScriptAlias / "c:/<myproject>/wsgi.py"
WSGIPythonHome "c:/envs/myproject"
WSGIPythonPath "c:/<myproject>"
Alias /static/ "c:/<myproject>/static/"
<Directory "c:/<myproject>/static">
Require all granted
</Directory>
<Directory c:/<myproject>>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
<Directory c:/<myproject>/attachments>
Require all granted
</Directory>
我将 PYTHONHOME 和 PYTHONPATH 设置为 "C:\Users\user\AppData\Local\Programs\Python\Python36;C:\Users\user\AppData\Local\Programs\Python\Python36\Scripts"
我看了很多问题,例如:
但此错误仅在 apache 中。
您的配置文件似乎没有问题。
我有一个类似的问题,我是如何解决的,
我检查了我的 Apache24
安装,它是 32 位的,而我的 python 安装是 64 位的,所以我不得不重新安装 Apache24 64 bit
版本并将再次在 httpd.conf
中配置。
我还必须将我的 python 安装在主 C
目录中,而不是安装在 \Users
目录中,所以我的基本 python 位置是 C:\Python36
,并在 system variables
的路径中包含 C:\Python36\
和 C:\Python36\Scripts\
然后创建一个新的 virtualenv 并包含在 Apache 配置中
幸运的是,我做到了。
我用 "virtualenvwrapper" 代替 Windows。真的很有帮助。
pip install virtualenvwrapper-win
mkvirtualenv myenv
pip install -r requirements.txt
pip install mod_wsgi-4.6.5+ap24vc14-cp36-cp36m-win_amd64.whl
工作顺利。
问题是 Windows 上的 Apache,当 运行 作为 服务 不接收 PYTHONHOME
环境变量,它需要正确的 Python 安装才能使用。
如果找不到它,它会给出一个关于 encdongs module not found
的误导性错误
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'
要让它工作,在 Windows 终端或 CMD 中,运行 Apache 作为标准可执行文件 - 不是作为服务:
set PYTHONHOME=<root-of-python-or-conda-env>
httpd // In this case, Apache server picks up PYTHONHOME and comes up
httpd -k start // as a service (need to be admin) - here it DOES NOT pick up PYTHONHOME and fails with the error above
另请注意,根据 mod_wsgi 作者,在 Windows 上,Apache 似乎忽略了 WSGIPythonHome 指令,所以不要别费心去那个兔子洞了。
我从 git 克隆了 repo。我创建了 venv:
python -m venv myenv
/myenv/scripts/activate.bat
pip install -r requirements.txt
pip install mod_wsgi-4.6.5+ap24vc14-cp36-cp36m-win_amd64.whl
如果我 运行 来自 myvenv 那:
python manage.py runserver
成功了!
如果我从 apache 运行,我有一个错误:
[Wed Oct 30 10:51:18.732028 2019] [mpm_winnt:notice] [pid 352:tid 168] AH00455: Apache/2.4.41 (Win64) mod_wsgi/4.6.5 Python/3.6 configured -- resuming normal operations
[Wed Oct 30 10:51:18.732028 2019] [mpm_winnt:notice] [pid 352:tid 168] AH00456: Apache Lounge VS16 Server built: Aug 9 2019 16:46:32
[Wed Oct 30 10:51:18.732028 2019] [core:notice] [pid 352:tid 168] AH00094: Command line: 'httpd -d C:/Apache24'
[Wed Oct 30 10:51:18.732028 2019] [mpm_winnt:notice] [pid 352:tid 168] AH00418: Parent: Created child process 1748
Fatal Python error: Py_Initialize: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'
Current thread 0x00000354 (most recent call first):
[Wed Oct 30 10:51:23.677228 2019] [mpm_winnt:crit] [pid 352:tid 168] AH00419: master_main: create child process failed. Exiting.
低于httpd.conf:
LoadFile "c:/<>/python/python36/python36.dll"
LoadModule wsgi_module "c:/envs/myproject/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd"
WSGIScriptAlias / "c:/<myproject>/wsgi.py"
WSGIPythonHome "c:/envs/myproject"
WSGIPythonPath "c:/<myproject>"
Alias /static/ "c:/<myproject>/static/"
<Directory "c:/<myproject>/static">
Require all granted
</Directory>
<Directory c:/<myproject>>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
<Directory c:/<myproject>/attachments>
Require all granted
</Directory>
我将 PYTHONHOME 和 PYTHONPATH 设置为 "C:\Users\user\AppData\Local\Programs\Python\Python36;C:\Users\user\AppData\Local\Programs\Python\Python36\Scripts"
我看了很多问题,例如:
您的配置文件似乎没有问题。 我有一个类似的问题,我是如何解决的,
我检查了我的 Apache24
安装,它是 32 位的,而我的 python 安装是 64 位的,所以我不得不重新安装 Apache24 64 bit
版本并将再次在 httpd.conf
中配置。
我还必须将我的 python 安装在主 C
目录中,而不是安装在 \Users
目录中,所以我的基本 python 位置是 C:\Python36
,并在 system variables
的路径中包含 C:\Python36\
和 C:\Python36\Scripts\
然后创建一个新的 virtualenv 并包含在 Apache 配置中
幸运的是,我做到了。
我用 "virtualenvwrapper" 代替 Windows。真的很有帮助。
pip install virtualenvwrapper-win
mkvirtualenv myenv
pip install -r requirements.txt
pip install mod_wsgi-4.6.5+ap24vc14-cp36-cp36m-win_amd64.whl
工作顺利。
问题是 Windows 上的 Apache,当 运行 作为 服务 不接收 PYTHONHOME
环境变量,它需要正确的 Python 安装才能使用。
如果找不到它,它会给出一个关于 encdongs module not found
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'
要让它工作,在 Windows 终端或 CMD 中,运行 Apache 作为标准可执行文件 - 不是作为服务:
set PYTHONHOME=<root-of-python-or-conda-env>
httpd // In this case, Apache server picks up PYTHONHOME and comes up
httpd -k start // as a service (need to be admin) - here it DOES NOT pick up PYTHONHOME and fails with the error above
另请注意,根据 mod_wsgi 作者,在 Windows 上,Apache 似乎忽略了 WSGIPythonHome 指令,所以不要别费心去那个兔子洞了。