Django Shell没有模块命名设置

时间:2011-09-09 21:21:57

标签: python django

我已经通过mod_wsgi将Django部署到Apache。从Apache托管时,Django运行正常。但是,我正在尝试通过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使用错误的设置模块名称?这让我发疯了。

13 个答案:

答案 0 :(得分:30)

如果您的根目录名称与其中一个应用的名称相同,则会发生这种情况。例如,我有一个名为bar的目录,其中包含一个名为bar的应用程序的Django项目:

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)
>>> 

答案 1 :(得分:8)

我遇到了类似的问题,当我试图运行时,返回了相同的错误     django-admin.py startproject myappprevious answer here让我明白了。问题是我之前已将DJANGO_SETTINGS_MODULE指向某个文件,我后来删除了该文件。为了解决这个问题,我刚用这个命令删除了指针:

export DJANGO_SETTINGS_MODULE=

答案 2 :(得分:7)

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)

答案 3 :(得分:3)

不知何故,如果您的项目文件夹与其中包含设置文件的应用程序名称相同,并且项目根文件夹中有__init__.py,则会导致wsgi混乱。我真的不明白为什么但删除这个文件解决了这个问题。

答案 4 :(得分:2)

虽然西蒙·惠特克的回答(同名的目录令人困惑的事情)肯定是关键,而不是建议你改变现有的整个目录结构,我可以建议:

而不是使用"故障" /模棱两可......

import settings

...使用更具体的......

from django.conf import settings

答案 5 :(得分:1)

由于您的Web应用程序正在运行,请检查您是否正在使用.wsgi文件中定义的相同python解释器运行manage.py(如果您将其他目录附加到.wsgi文件中的sys.path,确保他们也在这里的pythonpath。

如果您尝试在设置文件中导入抛出ImportError的内容,Django会告诉您无法导入设置。较新版本的django会提到(If the file settings.py does indeed exist, it's causing an ImportError somehow.),我已经碰到了几次。

如果不是这样,也许可以尝试使用django-admin.py,以防万一您的manage.py文件出现问题。 AFAIK没有充分的理由直接修改manage.py。

答案 6 :(得分:1)

我使用echo命令意外更改了DJANGO_SETTINGS_MODULE变量:echo DJANGO_SETTINGS_MODULE=mysite.settings

我只是退出virtualenv并再次激活它,这恢复了我的设置。

答案 7 :(得分:1)

如果你在生产中使用wsgi / uwsgi ......

我遇到了同样的错误:

如果您重命名django startproject创建的具有setting.py文件和wsgi.py的文件夹,请在wsgi.py文件中检查以下行:os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<your_folder_name>.settings")

在我的情况下,我不得不重命名&lt; your_folder_name&GT;还

答案 8 :(得分:0)

请检查virtualenv版本和django版本之间的兼容性。当它匹配时,它就像一个宝石。

答案 9 :(得分:0)

在我的情况下,当系统正常运行时wsgi.py文件可以正常工作,但是在尝试执行诸如migration或collectstatic的手动manage.py命令时出现了ImportError。

我检查了wsgi.py导入设置的方式,发现它首先将设置路径添加到sys.path中,如下所示:

import sys
sys.path.append('/opt/server/settings')

我将其添加到manage.py的顶部,并且可以正常工作。

答案 10 :(得分:0)

我已将DJANGO_SETTINGS_MODULE设置为“ mealer.settings”

(django-env)ali@a-N750JV:~/snap/projects-on-django/Rester$ export -p | grep DJANGO

declare -x DJANGO_SETTINGS_MODULE="mealer.settings"

我被

删除了
ali@ali-N750JV:~/snap/projects-on-django/Rester$ export -n  DJANGO_SETTINGS_MODULE

(django-env)ali@ali-N750JV:~/snap/projects-on-django/Rester$ export -p | grep DJAN

(django-env)ali@ali-N750JV:

export -p | grep DJAN一无所获

此答案基于Paul Meinshausen的答案

答案 11 :(得分:0)

对我来说,它实际上是PATH,所以项目不在路径内,我这样做了:

export PYTHONPATH=/var/www/project:$PYTHONPATH

如果是本地项目,则可能是这样的:

export PYTHONPATH=~/my-project:$PYTHONPATH

有问题吗?发表评论,我会回答。

答案 12 :(得分:0)

我的回答可能与问题不完全相符,但我必须指出。

一个原因可能是,该目录缺少 __init__.py 文件!

这是我的环境文件:

[root@hpc-proxy apigateway]# ls -al gateway/gateway/settings/
total 52
drwxr-xr-x 2 root root  228 Feb 19 18:19 .
drwxr-xr-x 3 root root  177 Feb 19 19:00 ..
-rw-r--r-- 1 root root 7738 Feb 19 17:52 base.py
-rw-r--r-- 1 root root 6722 Feb 19 18:19 base.pyc
-rw-r--r-- 1 root root 2539 Feb 19 15:02 shanghai07.py
-rw-r--r-- 1 root root  950 Feb  5 12:45 shanghai07root.py
-rw-r--r-- 1 root root 2828 Feb  5 13:00 testenv.py

我总是收到这样的错误信息: ImportError: No module named shanghai07

所以当我在 'settings' 目录中创建 __init__.py 文件时, 错误消失了!

希望我的回答能帮助到一些初学者。