Python ImportError:没有名为django.core.wsgi的模块
我正在将一个web应用程序从Windows环境移动到CentOS 5.11和Apache,在安装了所有组件之后,当我尝试加载该站点时,我将收到一个Python ImportError:没有名为django.core.wsgi的模块,python,django,apache,centos,mod-wsgi,Python,Django,Apache,Centos,Mod Wsgi,我正在将一个web应用程序从Windows环境移动到CentOS 5.11和Apache,在安装了所有组件之后,当我尝试加载该站点时,我将收到一个500。错误日志显示: mod_wsgi (pid=5461): Target WSGI script '/usr/local/treehouse/wsgi/index.wsgi' cannot be loaded as Python module. mod_wsgi (pid=5461): Exception occurred processing
500
。错误日志显示:
mod_wsgi (pid=5461): Target WSGI script '/usr/local/treehouse/wsgi/index.wsgi' cannot be loaded as Python module.
mod_wsgi (pid=5461): Exception occurred processing WSGI script '/usr/local/treehouse/wsgi/index.wsgi'.
Traceback (most recent call last):
File "/usr/local/treehouse/wsgi/index.wsgi", line 11, in <module>
from django.core.wsgi import get_wsgi_application
ImportError: No module named 'django.core.wsgi'
在交互式Python解释器中,它工作得很好。下面是导致错误的脚本(您在查找这些内容的任何地方都可以看到默认的index.wsgi
):
很明显,最后一行导致了错误,但有趣的是:最后一行仍然是问题所在,即使我在上面加上这个:
import django.core
import django.core.handlers
这两个底层软件包都可以顺利导入(django.core.wsgi
只是对django.core.handlers.wsgi
中某些功能的薄型包装)。只有当我尝试访问wsgi
包时,才会出现问题。检查此脚本中的sys.path
将显示所有正确的目录(/usr/local/lib/python3.4/site packages
等)。同样,从交互式解释器运行完全相同的代码不会导致错误
我尝试卸载/重新安装django(pip install django==1.6.5
),然后我将VM重置为完全干净的快照并重建/重新安装了所有内容,但仍然得到了完全相同的行为
发生了什么?一些由
pip
下拉的django源文件以Windows行结尾保存:也就是说,它们以\r\n
而不是\n
结尾。在*nix系统上,这会中断受影响文件中的导入,因为它不会查找django.core.wsgi
,而是尝试导入django.core.wsgi\r
这就是为什么仍然可以导入django.core.handlers
:\uuuu init\uuuuu.py
文件为空,因此没有要损坏的行尾
要修复此问题,请在受影响的文件上运行dos2unix
。我不确定有多少文件实际受到影响(除了它们中的许多文件),所以我只是用解释器中的一个快速Python脚本点击了所有文件:
import os
from os.path import abspath, join
for root, _, files in os.walk('/usr/local/lib/python3.4/site-packages/django'):
for f in files:
os.system('dos2unix %s' % abspath(join(root, f)))
瞧,再也没有导入错误了
故事时间 在我绝望地开始破解
django
源文件后,我偶然发现了这个问题。我通过添加以下内容编辑了django/core/_init__.py(通常为空):
from . import wsgi
我修改了index.wsgi
以包括以下内容:
import django.core
django.core.wsgi # no-op to see if we can access it
最后出现了一个令人着迷的新错误:
Traceback (most recent call last):
File "/usr/local/treehouse/wsgi/index.wsgi", line 11, in <module>
import django.core
File "/usr/local/lib/python3.4/site-packages/django/core/__init__.py", line 1, in <module>
from . import wsgi
File "/usr/local/lib/python3.4/site-packages/django/core/wsgi.py", line 1, in <module>
from django.core.handlers.wsgi import WSGIHandler
ImportError: No module named 'django.core.handlers.wsgi'
回溯(最近一次呼叫最后一次):
文件“/usr/local/treehouse/wsgi/index.wsgi”,第11行,在
导入django.core
文件“/usr/local/lib/python3.4/site packages/django/core/__init__.py”,第1行,在
从…起导入wsgi
文件“/usr/local/lib/python3.4/site packages/django/core/wsgi.py”,第1行,在
从django.core.handlers.wsgi导入WSGIHandler
ImportError:没有名为'django.core.handlers.wsgi'的模块
因此,我可以从django/core/\uuuu init\uuuuuuuu.py
中访问django/core/wsgi.py
。但是,django.core.handlers.wsgi
是遥不可及的。我删除了更改以重现原始错误,但错误已经更改。现在,即使没有显式的相对导入,我也没有得到名为'django.core.handlers.wsgi'的模块
这就是它击中我的时候。我在gedit中打开了django/core/handlers/wsgi.py
,单击一行的末尾,按空格键,删除插入内容,然后保存文件。这应该是禁止操作的。但是当我重新启动服务器时,突然导入错误转移到另一个django导入。唯一合乎逻辑的解释是行尾是错误的,通过在gedit中重新保存文件,我正在默默地修复它们
import django.core
django.core.wsgi # no-op to see if we can access it
Traceback (most recent call last):
File "/usr/local/treehouse/wsgi/index.wsgi", line 11, in <module>
import django.core
File "/usr/local/lib/python3.4/site-packages/django/core/__init__.py", line 1, in <module>
from . import wsgi
File "/usr/local/lib/python3.4/site-packages/django/core/wsgi.py", line 1, in <module>
from django.core.handlers.wsgi import WSGIHandler
ImportError: No module named 'django.core.handlers.wsgi'