【问题标题】:Django Shell No module named settingsDjango Shell 没有名为设置的模块
【发布时间】:2011-11-14 02:50:51
【问题描述】:

我已通过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 使用错误的设置模块名称?这让我发疯了。

【问题讨论】:

  • 在尝试修改 sys.path 之前,您是否以任何其他方式修改了 manage.py?
  • 你能发布你的 manage.py 文件吗?

标签: python django


【解决方案1】:

如果您的根目录名称与您的某个应用程序的名称相同,则可能会发生这种情况。例如,这里我有一个名为 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)
>>> 

【讨论】:

  • 是的。内置模块也会发生此命名空间错误。例如,我将根文件夹命名为 site,这与 Django 的 site 模块冲突。
  • 我在 wsgi.py 文件中有问题。这适用于 wsgi.py 文件吗?
【解决方案2】:

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

export DJANGO_SETTINGS_MODULE=

【讨论】:

  • 谢谢你,节省了我的时间
【解决方案3】:

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

【讨论】:

  • 实际上他告诉它已被识别“我已经通过 mod_wsgi 将 Django 部署到 Apache。从 Apache 托管时 Django 运行良好。”
  • 正确,我的 wsgi 很好。是我的 manage.py 坏了。奇怪的是,我使用与您发布的类似的方法修复了它。
  • 在我看来,你在WSGI中所做的事情应该在manage.py中进行镜像,即PATH环境变量应该相同。我认为这可以避免在使用 apache 提供 django 并使用 ./manage.py runserver、shell 等提供服务时造成混淆。
【解决方案4】:

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

【讨论】:

  • 我认为这是因为如果您有两个同名的嵌套文件夹,Django 会感到困惑,其中一个是 app 文件夹,这两个文件夹都包含 init.py . Django 是否将其解释为两个嵌套应用程序并在上层文件夹中查找设置?
  • 这太疯狂了!太感谢了!有谁明白为什么会这样?
【解决方案5】:

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

我遇到了同样的错误:

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

在我的情况下,我还必须重命名

【讨论】:

    【解决方案6】:

    虽然 Simon Whitaker 的回答(同名目录令人困惑)肯定是正确的,而不是建议您更改整个现有目录结构,但我建议:

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

    import settings
    

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

    from django.conf import settings
    

    【讨论】:

      【解决方案7】:

      我不小心使用 echo 命令更改了我的 DJANGO_SETTINGS_MODULE 变量:echo DJANGO_SETTINGS_MODULE=mysite.settings

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

      【讨论】:

        【解决方案8】:

        我将 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:
        

        导出-p |如您所见,grep DJAN 什么也没找到

        此答案基于 Paul Meinshausen 的回答

        【讨论】:

          【解决方案9】:

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

          一个原因可能是,该目录缺少__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

          所以当我在“设置”目录中创建__init__.py 文件时, 错误消失了!

          希望我的回答可以帮助一些初学者。

          【讨论】:

          • 如果 settings/__init__.py 存在,您可能有一个旧的 settings/__init__.pyc 可以删除:find . -name '*.pyc' -delete
          【解决方案10】:

          由于您的 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。

          【讨论】:

            【解决方案11】:

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

            【讨论】:

            • 我该怎么做?
            【解决方案12】:

            在我的情况下,当系统正常运行时 wsgi.py 文件正在工作,但是当我尝试执行手动 manage.py 命令(如 migrate 或 collectstatic)时收到 ImportError。

            我检查了 wsgi.py 以了解它导入设置的方式,并注意到它首先将设置路径添加到 sys.path,如下所示:

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

            我将它添加到 manage.py 的顶部并且它可以工作。

            【讨论】:

              【解决方案13】:

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

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

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

              export PYTHONPATH=~/my-project:$PYTHONPATH

              问题?评论我会回复的。

              【讨论】:

                【解决方案14】:

                我没有高兴地尝试了上面答案中的所有建议。 我的错误是启动命令行:

                python manage.py runserver --settings=settings 192.168.1.183:8006
                

                当我添加设置文件所在的目录时,高兴...

                python manage.py runserver --settings=<settings_file_dir>.settings 192.168.1.183:8006
                

                DJANGO_SETTINGS_MODULE 变量没有任何区别

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-07-08
                  • 2011-06-23
                  • 2021-03-14
                  • 2020-07-19
                  • 2011-05-20
                  • 1970-01-01
                  • 2018-08-08
                  相关资源
                  最近更新 更多