2012-05-16 55 views
1

我剛剛克隆使用水銀來,我已經建立了Python 2.7版在Windows機器上一個Django項目。當我嘗試運行manage.py(帶或不帶命令),我收到以下錯誤:Django的:manage.py導入錯誤,因爲環境變量未定義

Traceback (most recent call last): 
    File "C:\Users\jes.000\Documents\project\manage.py", line 30, in <module> 
    import django.core.servers.basehttp 
    File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 26, in <module> 
    from django.views import static 
    File "C:\Python27\lib\site-packages\django\views\static.py", line 95, in <module> 
    template_translatable = ugettext_noop(u"Index of %(directory)s") 
    File "C:\Python27\lib\site-packages\django\utils\translation\__init__.py", line 75, in gettext_noop 
    return _trans.gettext_noop(message) 
    File "C:\Python27\lib\site-packages\django\utils\translation\__init__.py", line 48, in __getattr__ 

    if settings.USE_I18N: 
    File "C:\Python27\lib\site-packages\django\utils\functional.py", line 184, in inner 
    self._setup() 
    File "C:\Python27\lib\site-packages\django\conf\__init__.py", line 40, in _setup 
    raise ImportError("Settings cannot be imported, because environment variable %s is undefined." %ENVIRONMENT_VARIABLE) 
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined. 

我明白manage.py應該設置環境變量。我也明白,我可能會得到這個錯誤,因爲該項目不在Python路徑中......但手動添加它似乎不應該是必要的。是不是manage.py應該解決這個問題呢?

編輯:我剛剛測試,發現它在Linux下完全一樣的事情。

編輯:這是一個非常有用的發現:如果我通過PIP安裝Django我只得到這個錯誤,它工作正常,如果我安裝在Ubuntu中的python-Django的包。所以有些東西是debian軟件包所做的,PIP不是。也許debian軟件包設置了一些環境變量?我需要弄清楚,因爲我試圖在Windows上開發。

編輯:我想我已經發現了這個問題,但不是一個解決方案。在Ubuntu機器上工作時,當我通過PIP(pip install django)安裝Django時,該項目無法處理我給出的錯誤。如果我創建了一個新項目(django-admin startproject testproject)並嘗試運行它,並且它由創建的文件夾中的manage.py和另一個包含其他文件夾的文件夾組成。就像這樣:

+-testproject 
    +-manage.py 
    +-testproject 
    +-__init__.py 
    +-etc. 

當我安裝Debian軟件包(apt-get install python-django)我試圖在作品使用的項目,如果我創建一個測試項目(django-admin startproject testproject)它有一個文件夾結構是這樣的:

+-testproject 
    +-manage.py 
    +-__init__.py 
    +-etc. 

注意不同之處:PIP Django包似乎將manage.py放在作爲應用程序的python模塊之外,而Debian軟件包則將manage.py放在模塊中。我認爲這是由於這兩個軟件包是不同版本的Django,在這兩個軟件包之間他們改變了結構,因爲這兩個軟件包做了不同的處理並沒有任何意義。

所以我的問題是,我試圖開發項目中使用一個已經Debian的包裝,而我的Windows機器上我試圖使用Django的版本從PIP版本最初產生。

麻煩的是,我不能確定如何來解決這個問題。天真地將manage.py移動到一個目錄中,使其位於項目文件夾的上方不起作用,因爲這個'debian-package version'manage.py嘗試僅僅是import settings,如果它與settings.py不在同一個文件夾中,它會失敗。但是在Django的其他地方,似乎期望項目本身位於//settings.py(如果使用了django-admin的pip版本,則會出現這種情況),而不是在/settings.py中(正如如果使用debian-package版本的話)。

如果我看它,在Ubuntu軟件庫的版本是1.3.1,而在PyPI中的版本是1.4。看發行說明1.4,嘿嘿:

An updated default project layout and manage.py that removes the 「magic」 from prior versions. And for those who don’t like the new layout, you can use custom project and app templates instead!

但是......不應該與1.3佈局生成的項目仍在1.4下工作..?

+1

也許這可以幫助:http://stackoverflow.com/questions/7479493/d​​jango-settings-module -is-undefined –

+0

我的理解是,manage.py(它實際上只是django-admin的包裝)的目的是消除全局設置這些值或手動提供它們的需要。 – jcrawfordor

+0

你是否在項目目錄或外部運行'manage.py'? – jdi

回答

2

我不確定這是否在更新版本的django中發生了變化,但默認manage.py只是試圖導入settings.py文件並啓動管理器。您預計會將該項目放入您的PYTHONPATH中,或默認情況下將settings.py放入您的DJANGO_SETTINGS_MODULE變量中。

您可以修改manage.py是有點聰明這個片段:

manage.py

#!/usr/bin/env python 
from django.core.management import execute_manager 

... 

import settings 

import os 
project = os.path.basename(os.path.dirname(__file__)) 
os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % project 

if __name__ == "__main__": 
    execute_manager(settings) 

現在你可以從任何位置運行manage.py,因爲它總是明確設置settings.py文件的路徑。

+0

當我嘗試像這樣修改它時,我得到一個導入失敗的錯誤(沒有名爲project.settings的模塊),詢問它是否在sys.path中。我不認爲我應該將項目目錄添加到任何地方的python路徑...不應該自動工作?看到我關於Debian軟件包的更新,我認爲這很重要。 – jcrawfordor

+0

@jcrawfordor:頂級目錄「project」的名字是? – jdi

+0

實際上並不是項目,而是與項目名稱相同(我沒有使用真實姓名)。 – jcrawfordor

0

這實際上是由於1.3和1.4之間的默認佈局不同。通常Django 1.3項目將在1.4以下工作,所以我在這裏發生了其他事情,我無法弄清楚。我已經確定問題不是依賴於平臺的。

我找不出確切的問題,但我確實找出了一個修復方法。那是:

  1. 在Django 1.4下創建一個新項目並挖掘其manage.py文件。更改項目名稱後,該文件將作爲manage.py使用。我將它命名爲'manage14.py',以便原來的manage.py將留給使用Django 1.3的同事。
  2. 將項目所在目錄之上的目錄添加到全局PYTHONPATH中。這不是一個理想的解決方案,但它允許未修改的Django 1.4 manage.py加載項目,而無需將項目轉換爲Django 1.4的組織。

儘快實際操作,我打算將該項目轉換爲Django 1.4格式,因爲無論如何它似乎更好,尤其是從避免這種問題的角度來看。不幸的是,我必須等到Ubuntu的回購協議獲得1.4後,我的同事才能使用PyPI在Windows上使用同樣的版本。

1

您可以將下面的代碼添加到該文件manage.py,像這樣:

from django.conf import settings 
settings.configure()