- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在将一个 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 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'
我找到了 this question (和相关的),这看起来很相似,但那里的答案都没有解决问题。我没有在 virtualenv
中运行,django 似乎安装正确,因为我可以运行违规语句:
>>> from django.core.wsgi import get_wsgi_application
在交互式 Python 解释器中它工作得很好很好。这是导致错误的脚本(它只是默认的 index.wsgi
,你到处都可以看到这个东西):
import os, sys
sys.path.append('/usr/local/treehouse/apple')
sys.path.append('/usr/local/treehouse/apple/apple')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "apple.settings")
from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
显然最后一行导致错误,但这是有趣的部分:最后一行仍然是问题,即使我在它上面添加:
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
仍然可以被导入的原因:__init__.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)))
Et voilà,没有更多的导入错误!
我在绝望中开始破解 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'
所以从 django/core/__init__.py
中,我可以访问 django/core/wsgi.py
。但是 django.core.handlers.wsgi
是遥不可及的。我删除了更改以重现原始错误——但错误已更改。现在,即使没有显式相对导入,我也得到了 No module named 'django.core.handlers.wsgi'
。
这就是它击中我的时候。我在 gedit 中打开 django/core/handlers/wsgi.py
,点击一行的结尾,按下空格键,删除插入,然后保存文件。它应该是一个空操作。但是当我重新启动服务器时,导入错误突然转移到不同的 django 导入。唯一合乎逻辑的解释是行尾错误,通过在 gedit 中重新保存文件,我默默地修复了它们。
关于python - 导入错误 : No module named django. core.wsgi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28055423/
我是一名优秀的程序员,十分优秀!