mod_wsgi:ImportError:没有名为'encodings'的模块

时间:2014-06-30 17:06:50

标签: python apache centos mod-wsgi selinux

我在CentOS 6.5上使用Apache 2.2.15。我正在尝试使用mod_wsgi设置Django应用程序。 我使用的是虚拟环境,mod_wsgi配置了--with-python=/path/to/virtualenv/bin/python3.4

我已将此添加到我的httpd.conf

WSGIPythonPath /srv/myproject:/path/to/virtualenv/lib/python3.4/site-packages
WSGIPythonHome /path/to/virtualenv
<VirtualHost *:80>
WSGIScriptAlias / /srv/myproject/myproject/wsgi.py
...
</VirtualHost>

wsgi.py中,我添加了

sys.path.insert(1, "/path/to/virtualenv/lib/python3.4/site-packages")

问题在于,当我尝试在浏览器中打开应用程序时,它会无限期地加载。这是Apache错误日志:

Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
[Mon Jun 30 17:37:28 2014] [notice] child pid 19370 exit signal Aborted (6)
[Mon Jun 30 17:37:28 2014] [notice] child pid 19371 exit signal Aborted (6)
...
[Mon Jun 30 17:37:28 2014] [notice] child pid 19377 exit signal Aborted (6)
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'

有趣的是,在Python(2.6)的系统安装和虚拟环境版本(3.4)中,import encodings工作正常!我尝试使用the mod_wsgi CheckingYourInstallation page中的示例WSGI脚本来确认Apache正在使用哪个版本的Python,但是我得到了相同的ImportError。

有没有人对后续步骤有什么建议?我已经搜过了文档,但我不知道从哪里开始。

3 个答案:

答案 0 :(得分:4)

所以在我朋友的帮助下(IE:SysAdmins),我们昨晚得到了这个结果。我通过示例最好地学习,所以让我们假设您使用mod_wsgi运行Apache作为Linux组apache并使用用户flipperpa。假设您在my_project / wsgi.py中使用wsgi.py在/ home / my_project中托管。

在顶层(ls -l /):

drwxr-xr-x.  47 root root  4096 Jul  9 09:43 home

在主目录(ls -l / home)中:

drwxrwsr-x   7 flipper        apache 4096 Jul 29 10:22 my_project

这是关键。小写“s”表示设置了apache组的setgid位,并设置了执行位。当然,最后的“x”意味着任何人都可以执行。

检查树下的权限;这对我们起了作用。

答案 1 :(得分:2)

问题是由SELinux引起的。我做的是这个:

  • 将项目文件移至/ home / admin / myproject
  • 更改了权限,如FlipperPA的回答
  • 并且,我认为,使用httpd_enable_homedirson SELinux布尔值设置为setsebool -P httpd_enable_homedirs on

CentOS维基上的SELinux guide非常有帮助。例如,要调试您可以运行setenforce Permissive,因此SELinux不会强制执行其规则,但仍会写入日志。请记住之后再次setenforce Enforcing

答案 2 :(得分:0)

在Windows上,我通过将Python安装的Lib目录直接放在PYTHONPATH上解决了这个问题。这是必要的,即使你在同一个shell中直接运行Python,它也不需要这个来查找编码包:

set PYTHONPATH=C:\WinPython-64bit-3.4.4.6Qt5\python-3.4.4.amd64\Lib;%PYTHONPATH%
c:\apache24\bin\httpd.exe

另外请务必使用正确的mod_wsgi版本。我从Unofficial Binaries page下载了我的,并选择它来匹配Python(上例中的64位3.4)。在上面更改为启动Apache的.bat文件之后,我的网站可以正常使用Python。

注意我的Python版本WinPython是通过解压缩安装并将其放在C:驱动器中来安装的。因此,它没有以通常的Windows方式安装在注册表中,这应该最小化注册表交互注意事项。

相关问题