Django:manage.py ImportError,因为环境变量未定义

时间:2012-05-16 23:05:50

标签: python django

我刚刚将一个使用Mercurial的Django项目克隆到我已经设置了Python 2.7的Windows机器上。当我尝试运行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版本&#39; 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的发行说明,嘿:

  

更新的默认项目布局和manage.py删除了   来自先前版本的“魔力”。对于那些不喜欢新人的人   布局,您可以使用自定义项目和应用程序模板!

但是......使用1.3版本生成的项目仍然不能在1.4 ..?

下工作

3 个答案:

答案 0 :(得分: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文件的路径。

答案 1 :(得分:1)

您可以将以下代码添加到 manage.py 文件中,如下所示:

from django.conf import settings  
settings.configure()

答案 2 :(得分: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的组织。
  3. 一旦实用,我计划将项目转换为Django 1.4格式,因为它似乎更好,特别是从避免这种问题的角度来看。不幸的是,我必须等到Ubuntu repo的1.4才能让我的同事使用PyPI达到我在Windows上的相同版本。