导入Django设置时出现奇怪错误
我有很多项目是在Ubuntu系统上用Python 2.7和virtualenv/virtualenvwrapper做的。在我的工作中,有些开发者用的是macOS和Windows。一般来说,我创建项目的方式都是一样的:
django-admin.py start project x
我们使用svn来管理代码,但有时候,我尝试一些操作时,出现了一些我无法理解的问题,比如:
python manage.py runserver
这个操作不成功,但这只发生在我自己的笔记本上,其他开发者和生产服务器上都没问题。
有没有什么建议?
我遇到了这个错误:
错误:在包含'manage.py'的目录中找不到文件'settings.py'。看起来你做了一些自定义设置。你需要运行django-admin.py,并传入你的设置模块。(如果settings.py文件确实存在,可能是因为某种原因导致了ImportError。)
但显然,settings文件是存在的,并且和manage.py文件在同一个文件夹里,只有我这边不工作...
这在使用django和appengine时也会发生。
3 个回答
我花了一个小时在Django的代码里到处找,最后发现了这个:
manage.py [command] --traceback
原来我的应用里有个导入错误。一旦我看到了这个错误,修复它只花了十秒钟。 :/
如果你在尝试使用django和appengine时遇到这个错误,并且你是按照这个指南来操作的,
而且你创建了指向文件夹的符号链接,那么这个指南在创建djangoappengine的符号链接时是错误的。你需要向上移动一个目录,比如:
错误的做法:
把以下文件夹复制到你的项目中(例如,django-testapp):
django-nonrel/django => <project>/django
djangotoolbox/djangotoolbox => <project>/djangotoolbox
django-autoload/autoload => <project>/autoload
django-dbindexer/dbindexer => <project>/dbindexer
djangoappengine => <project>/djangoappengine
正确的做法:
把以下文件夹复制到你的项目中(例如,django-testapp):
django-nonrel/django => <project>/django
djangotoolbox/djangotoolbox => <project>/djangotoolbox
django-autoload/autoload => <project>/autoload
django-dbindexer/dbindexer => <project>/dbindexer
djangoappengine/djangoappengine => <project>/djangoappengine
注意最后一行。
我遇到了这个错误:
错误:在包含 'manage.py' 的目录中找不到文件 'settings.py'。看起来你做了一些自定义设置。你需要运行 django-admin.py,并传入你的设置模块。(如果 'settings.py' 文件确实存在,但还是出现了 ImportError,那就说明有其他问题。)
manage.py
脚本每当发生导入错误时都会打印这个警告,所以如果你的 settings.py
模块导入了其他东西,而这些东西导致了导入错误,manage.py
仍然会打印这个警告。
一种诊断方法是(暂时)修改 manage.py
从
#!/usr/bin/env python
from django.core.management import execute_manager
try:
import settings # Assumed to be in the same directory.
except ImportError:
import sys
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
sys.exit(1)
if __name__ == "__main__":
execute_manager(settings)
改为
#!/usr/bin/env python
from django.core.management import execute_manager
import settings # Assumed to be in the same directory.
if __name__ == "__main__":
execute_manager(settings)
然后在运行 $ python manage.py runserver
时查看打印出的堆栈跟踪信息。