【发布时间】: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.. 下工作吗?
【问题讨论】:
-
我的理解是,manage.py(实际上只是 django-admin 的包装器)的目的是消除全局设置这些值或手动提供它们的需要。
-
你是在项目目录内部还是外部运行
manage.py? -
内。 CWD是包含manage.py、settings.py等的目录
-
django 1.4 确实更改了默认项目布局,但我可以确认它没有什么不同,您可以在 django 1.4 下运行以前的结构。基本上,设置你的pythonpath,在我的答案中使用我推荐的方法(这确实有效),或者将环境变量设置为指向设置文件