ModuleNotFoundError:没有名为 Foo 的模块 - 如何将模型导入 Django 应用程序的脚本?

Posted

技术标签:

【中文标题】ModuleNotFoundError:没有名为 Foo 的模块 - 如何将模型导入 Django 应用程序的脚本?【英文标题】:ModuleNotFoundError: No module named Foo - How can I import a model into a Django app's script? 【发布时间】:2020-03-28 07:26:02 【问题描述】:

我的 Django 技能水平:noob

我在正确设置DJANGO_SETTINGS_MODULE 以最终在脚本中导入我的模型时发疯了。我为我的项目使用virtualenv

这是我当前的错误:

ModuleNotFoundError: No module named 'dashex'

以及对应的feeder.py 脚本:

import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'dashex.settings'
sys.path.append('os.path.dirname(os.path.dirname(os.path.abspath(__file__)))')
import django
django.setup()
import zmq
import time
from time import sleep
import uuid
from Dashboard_app.models import AccountInformation
[...]

背景:

我首先使用了here 发布的settings.configure() 解决方案。但是,这个解决方案引发了this 错误...所以我希望DJANGO_SETTINGS_MODULE 可以解决问题。

根据文档 (docu) 我必须使用Django-admin 来设置DJANGO_SETTINGS_MODULE

我的尝试:

在 Windows 上的命令提示符中执行 $ set DJANGO_SETTINGS_MODULE=dashex.settings,但没有任何反应。

已执行 $ py manage.py set DJANGO_SETTINGS_MODULE=dashex.settings 引发错误 unknown command set

在我的项目的manage.py 根目录中执行$ django-admin set DJANGO_SETTINGS_MODULE=dashex.settings 引发错误no module named dashex

@Casper 的This 回答建议执行上述操作,但如何处理:C:\temp\testproject> set DJANGO_SETTINGS_MODULE=testproject.settings ?

@Max 的This 解决方案建议将export DJANGO_SETTINGS_MODULE=<django_project>.settings 附加到我的虚拟环境中。这是什么意思,怎么做?

已执行 $ django-admin runserver --settings=dashex.settings,这也会引发错误 no module named dashex

已执行 $ py manage.py runserver --settings=dashex.settings 以正确的设置启动服务器。 但最初提到的错误仍然存​​在。

我的项目:

Settings.py:

import os.path
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Static files (CSS, javascript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/


STATIC_ROOT = ''
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = ''

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ["127.0.0.1", "locahost"]


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    #other Apps
    'Wiki_app',
    'rest_framework',
    'Dashboard_app.apps.DashboardAppConfig'
]

@alasdair 解决方案后的最新回溯:

Traceback (most recent call last):
  File "C:\Users\Jonas Blickle\Desktop\dashex\Dashboard_app\feeder.py", line 6, in <module>
    django.setup()
  File "C:\Program Files\lib\site-packages\django\__init__.py", line 19, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "C:\Program Files\lib\site-packages\django\conf\__init__.py", line 79, in __getattr__
    self._setup(name)
  File "C:\Program Files\lib\site-packages\django\conf\__init__.py", line 66, in _setup
    self._wrapped = Settings(settings_module)
  File "C:\Program Files\lib\site-packages\django\conf\__init__.py", line 157, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "C:\Program Files\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'dashex'
[Finished in 0.37s]

工作解决方案:

import sys
sys.path.insert(0, r"C:\Users\Jonas\Desktop\Dashex")
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'Dashex.settings'
import django
django.setup()
from Dashboard.models import AccountInformation
[...]

【问题讨论】:

你不需要做任何这些。您应该使用 manage.py 而不是 django-admin,它会为您处理它。尽管请注意,您在某些时候无法避免使用 shell。 @DanielRoseman 使用上面的manage.py 添加了结果。我让服务器以正确的设置运行,但是当我运行脚本时,我再次遇到同样的错误。 不要使用 from models import AccountInformation 之类的导入。始终相对于项目目录(带有manage.py 的目录)进行导入。所以导入应该是from Dashboard_app.models import AccountInformation @Phanti 当 Daniel 说“改用 manage.py”时,他说的是可以使用 manage.py 调用的 using custom management commands。这是在您的 Django 项目上运行脚本的官方规范的祝福方式,实际上比弄乱 envvars 等更简单(和可靠)。 【参考方案1】:

django-admin 和 manage.py 不用于设置环境变量,因此您的问题中的命令如 django-admin set DJANGO_SETTINGS_MODULE=dashex.settings 没有意义。

在 Windows 上,您可以在运行脚本之前在命令提示符下运行 set DJANGO_SETTINGS_MODULE=dashex.settings。你说你不想使用shell,所以在脚本中设置环境变量可能会更容易。

import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'dashex.settings'

# Since feeder.py is in Dashboard_app, you need to add the parent directory
# to the python path so that dashex can be imported
# (without this you'll get the 'no module named dashex' error)
sys.path.append('..')

import django
django.setup()

# Now you can import models

【讨论】:

感谢您的帮助。我相应地编辑了我的脚本,现在它引发了no module named dashex。 :-( 我在上面添加了回溯。 您的INSTALLED_APPS 中是否有dashex,或者您的INSTALLED_APPS 之一中是否有从dashex 导入的东西? 除了我的wiki_app 没有从模块dashex 导入任何东西之外,我没有任何其他应用程序。 Dashex 本身不在我的INSTALLED_APPS 中,因为它是包含settings.py 的基础项目根目录。同样将导入更改为相对会不断引发错误no module named dashex 对于这两个点,我需要在sys.path.append('..') 中添加什么特别的内容吗? 不,我的意思是..(表示父目录)。也许当前的工作目录不是我所期望的。而不是.. 尝试os.path.dirname(os.path.dirname(os.path.abspath(__file__)))。尝试打印该值以确保其正确 - 它应该为您提供包含 manage.py 的目录。

以上是关于ModuleNotFoundError:没有名为 Foo 的模块 - 如何将模型导入 Django 应用程序的脚本?的主要内容,如果未能解决你的问题,请参考以下文章

ModuleNotFoundError:没有名为“dataviz”的模块

ModuleNotFoundError:没有名为“numpy”的模块

错误:ModuleNotFoundError:没有名为“图像”的模块

ModuleNotFoundError:没有名为“knox”的模块

ModuleNotFoundError:没有名为“memoize”的模块

ModuleNotFoundError:没有名为“pssh”的模块