在Linux 或OS X环境下部署网站很容易,可以选择的组合很多,如nginx+uwsgi或apache+mod_wsgi都可以。但到了Windows环境下就没有那么多选项了。使用Python开发的网站的话,只有Apache+mod_wsgi可以使用了。原来在Python3.4 下一直用的好好的,最近把Python升级到3.5.2之后,发现Apache服务器没办法启动了,经过一番折腾,终于搞定了。
原来一直以为Apache不支持Python3.5,反复的下载、重装Python、mod_wsgi等程序,折腾了好久。今天在网上看到一篇文章,上面提到要看日志,才突然明白自己原来一直在瞎折腾。
于是打开Apache的日志,看到下面这一段:
[Wed Sep 07 09:18:06.606497 2016] [wsgi:warn] [pid 5432:tid 508] mod_wsgi: Compiled for Python/3.5.1.
[Wed Sep 07 09:18:06.607499 2016] [wsgi:warn] [pid 5432:tid 508] mod_wsgi: Runtime using Python/3.5.2.
[Wed Sep 07 09:18:06.608499 2016] [mpm_winnt:notice] [pid 5432:tid 508] AH00455: Apache/2.4.16 (Win64) mod_wsgi/4.4.23 Python/3.5.2 configured -- resuming normal operations
[Wed Sep 07 09:18:06.608499 2016] [mpm_winnt:notice] [pid 5432:tid 508] AH00456: Apache Lounge VC14 Server built: Jul 22 2015 13:24:19
[Wed Sep 07 09:18:06.608499 2016] [core:notice] [pid 5432:tid 508] AH00094: Command line: 'c:\\apache24\\bin\\httpd.exe -d C:/Apache24'
[Wed Sep 07 09:18:06.610500 2016] [mpm_winnt:notice] [pid 5432:tid 508] AH00418: Parent: Created child process 1276
[Wed Sep 07 09:18:06.905541 2016] [wsgi:warn] [pid 1276:tid 412] mod_wsgi: Compiled for Python/3.5.1.
[Wed Sep 07 09:18:06.905541 2016] [wsgi:warn] [pid 1276:tid 412] mod_wsgi: Runtime using Python/3.5.2.
Fatal Python error: Py_Initialize: unable to load the file system codec
ImportError: No module named 'encodings'
看了日志后,以为是mod_wsgi和Python的版本不匹配,于是卸载了Python3.5.2,并重新安装上了Python3.5.1,结果发现还是无法启动Apache服务。
认真阅读了日志才发现自己理解错了。python和mod_wsgi的版本不匹配只是警告信息,真正严重的错误在于:无法load the file system codec,是因为无法引入encodings模块造成的。
进入终端模式后,试了一下导入encodings之后,发现是正常的。于是在网上百度了下,发现可能是因为PYTHONPATH变量未设置造成的。然后设置PYTHONPATH变量为“%USERPROFILE%\AppData\Local\Programs\Python\Python35\DLLs;%USERPROFILE%\AppData\Local\Programs\Python\Python35\Lib;%USERPROFILE%\AppData\Local\Programs\Python\Python35\Lib\site-packages”,然后再启动Apache服务器,发现一切正常了。
Python3.5是一个比较新的版本,很多东西和之前的版本不一样,下面这些环境变量都需要设置,否则可能会碰到意思不到的问题:
在PATH中增加路Python的相关路径
需要在PATH变量中增加%USERPROFILE%\AppData\Local\Programs\Python\Python35\Scripts和%USERPROFILE%\AppData\Local\Programs\Python\Python35。当然,这个可以在安装Python3.5的时候勾选一下就可以了,默认选项是不增加。设置PYTHONPATH
这个需要新增PYTHONPATH变量,值设置成“%USERPROFILE%\AppData\Local\Programs\Python\Python35\DLLs;%USERPROFILE%\AppData\Local\Programs\Python\Python35\Lib;%USERPROFILE%\AppData\Local\Programs\Python\Python35\Lib\site-packages”。增加PATHEXT增加Python脚本的扩展名
这个需要将.PY和.PYW增加到PATHEXT环境变量中。设置完成后执行Python脚本时,只需要输入文件名即可。