mod_wsgi:ImportError:找不到名为'encodings'的模块

24

我在 CentOS 6.5 上使用 Apache 2.2.15。我正在尝试使用 mod_wsgi 设置 Django 应用程序。

我正在使用虚拟环境,并且使用 --with-python=/path/to/virtualenv/bin/python3.4 配置了 mod_wsgi。

我已将此添加到我的 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 都能正常工作!我尝试使用 mod_wsgi CheckingYourInstallation 页面上的示例 WSGI 脚本 来确认 Apache 正在使用哪个版本的 Python,但我得到了相同的 ImportError。
有人有什么建议吗?我已经搜遍了文档,但不知道下一步该去哪里。

可能存在访问权限问题。Apache用户是否对虚拟环境中的所有内容(包括目录和父目录的执行权限)都具有读取权限? - mata
是的,确实如此。即使将我的虚拟环境文件夹中的所有内容设置为777也没有起作用! - tao_oat
我在使用CentOS 6.5和Apache 2.2.15时遇到了同样的问题 - Py_Initialize无法导入编码。当我编译Python 3.4.1时,它警告我有一个执行前缀。也许这些是相关的。如果你有解决方案,我会很乐意知道。 - Michael Miller
1
我通过使用virtualenv而不是pyvenv解决了我的问题。事实证明,pyvenv没有像encoding这样的所有本地模块都建立符号链接,但是virtualenv做到了。关于Python 3.4中的pyvenv和virtualenv的更多信息 - Michael Miller
3个回答

7

昨晚在我的朋友(即系统管理员)的帮助下,我们解决了这个问题。我最喜欢学习示例,所以让我们假设您正在使用 mod_wsgi 作为 Linux 组 apache 的 Apache 运行,并且用户为 flipperpa。假设您的主机位于 /home/my_project,其中 wsgi.py 在 my_project/wsgi.py。

在顶级目录(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"表示任何人都可以执行。
检查你树形结构下的权限;这对我们很管用。

这是我的问题,与“应用程序”在同一目录中的一个Python文件未被导入。更改了文件的权限,以便组和其他人都可以读取,问题解决了。 - user1063287
2
我已经按照您在此处提到的所有步骤进行了尝试,但仍然出现相同的错误。 - Sahadev
你正在使用启用了SELinux的CentOS/RedHat吗?如果是,你需要设置文件的安全上下文。 - FlipperPA

2
这个问题是由SELinux引起的。我所做的是:
  • 将项目文件移动到/home/admin/myproject
  • 按照FlipperPA的答案更改权限
  • 关键的是,使用setsebool -P httpd_enable_homedirs onhttpd_enable_homedirs SELinux布尔值设置为on
CentOS维基上的SELinux指南非常有帮助。例如,要进行调试,可以运行setenforce Permissive,这样SELinux就不会执行其规则,但仍会写入日志。只需记得之后再次运行setenforce Enforcing

1
在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版本。我从非官方二进制文件页面下载了我的版本,并选择了与Python匹配的版本(在上面的示例中是64位3.4)。在上述更改.bat文件启动Apache后,我的网站可以正确地与Python一起工作。
请注意,我的Python版本WinPython是通过解压缩安装并放置在C:驱动器中安装的。因此,它没有像通常的Windows方式那样安装在注册表中,这应该最小化注册表交互考虑。

那并不是必要的。这可能为您解决问题,但不太可能修复真正的问题。您确定mod_wsgi甚至是从该Python安装构建的吗?还有可能自Python安装以来,您的注册表条目已经损坏,或者Python未被安装为所有用户所需,如果使用mod_wsgi并且Apache作为服务运行。 - Graham Dumpleton
WinPython不是按照通常的Windows方式安装的:您只需在解压缩后将其放入C:驱动器即可。 mod_wsgi是从非官方二进制页面下载的,并选择与Python匹配(例如上面的64位3.4)。 经过修复,该网站可以正确地使用Python。弄清楚为什么它在Windows上完成了工作超出了我的Windows技能水平。 - Lars Ericson
这与SELinux有什么关系? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接