簡體   English   中英

ImportError:沒有名為django.core.wsgi的模塊

[英]ImportError: No module named django.core.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 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'

我發現了這個問題 (以及相關問題), 這個問題似乎很相似,但沒有一個問題可以解決這個問題。 沒有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)))

Etvoilà ,沒有更多的導入錯誤!


講故事的時間

在我絕望地開始攻擊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'No module named 'django.core.handlers.wsgi'即使沒有明確的相對導入。

這是它擊中我的時候。 我在gedit中打開了django/core/handlers/wsgi.py ,單擊了行的末尾,按下空格鍵,刪除了插入,並保存了文件。 它應該是一個無操作。 但是當我重新啟動服務器時,突然導入錯誤已轉移到另一個django導入。 唯一合乎邏輯的解釋是行結尾是錯誤的,通過在gedit中重新保存文件,我正默默地修復它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM