【问题标题】:Django: manage.py ImportError because environment variable is undefinedDjango:manage.py ImportError,因为环境变量未定义
【发布时间】:2012-05-24 13:41:57
【问题描述】:

我刚刚将一个使用 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 机器上,我正在尝试使用来自 pip 的 Django 版本。

问题是我不确定如何解决这个问题。天真地将 manage.py 向上移动一个目录,使其位于项目文件夹之上是行不通的,因为这个“debian-package 版本”manage.py 尝试只使用import 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.. 下工作吗?

【问题讨论】:

  • 也许这会有所帮助:stackoverflow.com/questions/7479493/…
  • 我的理解是,manage.py(实际上只是 django-admin 的包装器)的目的是消除全局设置这些值或手动提供它们的需要。
  • 你是在项目目录内部还是外部运行manage.py
  • 内。 CWD是包含manage.py、settings.py等的目录
  • django 1.4 确实更改了默认项目布局,但我可以确认它没有什么不同,您可以在 django 1.4 下运行以前的结构。基本上,设置你的pythonpath,在我的答案中使用我推荐的方法(这确实有效),或者将环境变量设置为指向设置文件

标签: python django


【解决方案1】:

我不确定这是否在更新版本的 django 中发生了变化,但默认的 manage.py 只是尝试导入 settings.py 文件并启动管理器。默认情况下,您应该将项目放入您的 PYTHONPATH 中,或者将 settings.py 放入您的 DJANGO_SETTINGS_MODULE 变量中。

您可以使用这个 sn-p 修改 manage.py 使其更智能:

ma​​nage.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 文件的路径。

【讨论】:

  • 当我尝试像这样修改它时,我收到导入失败的错误(没有名为 project.settings 的模块),询问它是否在 sys.path 中。我认为我不应该将项目目录添加到任何地方的python路径......这不应该自动工作吗?请参阅我关于 debian 软件包的更新,我认为这很重要。
  • @jcrawfordor: 顶级目录的名称是“project”吗?
  • 不是真正的项目,而是和项目名称一样(我没有使用真实名称)。
【解决方案2】:

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

from django.conf import settings  
settings.configure()

【讨论】:

    【解决方案3】:

    这确实是由于 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 repo 获得 1.4,这样我的同事才能使用 PyPI 在 Windows 上达到与我相同的版本。

    【讨论】:

      猜你喜欢
      • 2012-07-14
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 2020-08-09
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多