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

问题描述 投票:15回答:3

我在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。

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

python apache centos mod-wsgi selinux
3个回答
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”意味着任何人都可以执行。

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


2
投票

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

  • 将项目文件移动到/ home / admin / myproject
  • 在FlipperPA的答案中更改了权限
  • 而且,至关重要的是,我认为,使用httpd_enable_homedirson SELinux布尔值设置为setsebool -P httpd_enable_homedirs on

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


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方式安装在注册表中,这应该最小化注册表交互注意事项。

© www.soinside.com 2019 - 2024. All rights reserved.