【发布时间】:2014-08-21 03:11:23
【问题描述】:
我在 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。
有人对下一步有什么建议吗?我已经搜索了文档,但我不知道从哪里开始。
【问题讨论】:
-
可能是访问权限问题。 apache 用户是否对您的 virtualenv 中的所有内容具有读取权限(包括目录和父目录的执行权限)?
-
是的,确实如此。即使将我的虚拟环境文件夹中的所有内容都设置为 777 也不起作用!
-
我在使用 CentOS 6.5 和 Apache 2.2.15 时遇到了同样的问题 - Py_Initialize 无法导入编码。当我编译 Python 3.4.1 时,它给了我一些关于 exec 前缀的警告。也许这些是相关的。如果您有解决方案,我很想知道。
-
我通过使用 virtualenv 而不是 pyvenv 解决了我的问题。事实证明,pyvenv 并没有像 encoding 那样对所有本地模块进行符号链接,但 virtualenv 做到了。 More information about pyvenv vs virtualenv for Python 3.4
标签: python apache centos mod-wsgi selinux