Django Shell 找不到名为 settings 的模块

33 投票
14 回答
116054 浏览
提问于 2025-04-17 01:56

我把Django部署到Apache上,使用了mod_wsgi。Django在Apache上运行得很好。不过,我想通过manage.py做一些维护,但每次运行时都会出现一个错误:

错误:无法导入设置 'myproject.settings'(它在sys.path上吗?):没有名为settings的模块

user@localhost:~$ cd /usr/local/myproject
user@localhost:/usr/local/myproject$ ls
drwxr-xr-x 2 apache apache   4096 2011-09-07 19:38 apache
-rw-r--r-- 1 apache apache      0 2011-05-25 14:52 __init__.py
-rw-r--r-- 1 apache apache    813 2011-09-09 16:56 manage.py
drwxr-xr-x 6 apache apache   4096 2011-09-09 16:43 myapp
-rw-r--r-- 1 apache apache   4992 2011-09-07 19:31 settings.py
drwxr-xr-x 4 apache apache   4096 2011-09-08 20:32 templates
-rw-r--r-- 1 apache apache   1210 2011-09-08 14:49 urls.py

Django似乎忽略了DJANGO_SETTINGS_MODULE这个环境变量。

user@localhost:~$ cd /usr/local/myproject
user@localhost:/usr/local/myproject$ export DJANGO_SETTINGS_MODULE=settings
user@localhost:/usr/local/myproject$ python manage.py shell
Error: Could not import settings 'myproject.settings' (Is it on sys.path?): No module named settings
user@localhost:/usr/local/myproject$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import settings
>>> 

为了确认我没有搞错,我把manage.py里面的内容都注释掉,只留下import settings这一行,结果它正常运行了。

我还尝试在manage.py的开头直接设置os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'sys.path.append('/usr/local/myproject'),但都没有用。

这到底是怎么回事?为什么Django使用了错误的设置模块名?这让我很头疼。

14 个回答

10

看起来你的项目路径没有被wsgi识别。这种情况我也遇到过,为了解决这个问题,我在我的.wsgi文件的顶部添加了以下内容:

import os
import sys

root_path = os.path.abspath(os.path.split(__file__)[0])
sys.path.insert(0, os.path.join(root_path, 'project_name'))
sys.path.insert(0, root_path)
17

我之前也遇到过类似的问题,当我尝试运行 django-admin.py startproject myapp 时,总是出现同样的错误。 之前有个回答帮我解决了这个问题。问题在于,我之前把 DJANGO_SETTINGS_MODULE 指向了一个特定的文件,但后来我把那个文件删掉了。要解决这个问题,我只需要用这个命令把指向去掉:

export DJANGO_SETTINGS_MODULE=

42

这种情况可能发生在你的根目录的名字和你某个应用的名字是一样的。例如,这里我有一个叫做 bar 的目录,里面包含一个 Django 项目,而这个项目里也有一个叫 bar 的应用:

Simons-MacBook-Pro ~/temp
$ cd bar

Simons-MacBook-Pro ~/temp/bar
$ ./manage.py shell
Error: Could not import settings 'bar.settings' (Is it on sys.path?): No module named settings

Simons-MacBook-Pro ~/temp/bar
$ ls -l
total 48
-rw-r--r--  1 simon  staff     0 25 Oct 10:46 __init__.py
-rw-r--r--  1 simon  staff   130 25 Oct 10:46 __init__.pyc
drwxr-xr-x  7 simon  staff   238 25 Oct 10:46 bar
-rwxr-xr-x  1 simon  staff   503 25 Oct 10:46 manage.py
-rw-r--r--  1 simon  staff  5025 25 Oct 10:46 settings.py
-rw-r--r--  1 simon  staff  2658 25 Oct 10:46 settings.pyc
-rw-r--r--  1 simon  staff   556 25 Oct 10:46 urls.py

把根目录的名字改成 foo(或者其他任何不是 bar 的名字)就能解决这个问题:

Simons-MacBook-Pro ~/temp/bar
$ cd ..

Simons-MacBook-Pro ~/temp
$ mv bar foo

Simons-MacBook-Pro ~/temp
$ cd foo

Simons-MacBook-Pro ~/temp/foo
$ ./manage.py shell
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

撰写回答