gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:43:43 24 4
gpt4 key购买 nike

我刚刚使用 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尝试仅导入设置,如果它不在项目文件夹中,则会失败与 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 下工作吗...?

最佳答案

我不确定这在最新版本的 django 中是否有所改变,但默认的 manage.py 只是尝试导入 settings.py 文件并启动管理者。默认情况下,您需要将项目放入 PYTHONPATH 中,或者将 settings.py 放入 DJANGO_SETTINGS_MODULE 变量中。

您可以使用以下代码段修改 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 文件的路径。

关于python - Django:manage.py ImportError 因为环境变量未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10627943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com