如何使用settings.py文件的绝对路径设置DJANGO_SETTINGS_MODULE

问题描述 投票:0回答:1

我需要为 django 编写一些脚本,并尝试在每个脚本的开头设置 DJANGO_SETTINGS_MODULE 环境变量。脚本、

manage.py
myproject
目录位于同一父目录中。此外,
settings.py
文件位于
myproject
目录中。

因此,以下代码可以正常工作

#test_script_header.py

import os
os.environ["DJANGO_SETTINGS_MODULE"] = "myproject.settings"

import django
django.setup()

但是下面的代码不起作用

#test_script_header.py

import os
os.environ["DJANGO_SETTINGS_MODULE"] = "/home/<username>/workspace/djangoapp/src/myproject/settings.py"

import django
django.setup()

我收到错误

ModuleNotFoundError: No module named '/home/<username>/workspace/djangoapp/src/myproject/settings.py'

这是完整的错误消息

Traceback (most recent call last):
  File "/home/<username>/workspace/djangoapp/src/test_script_header.py", line 22, in <module>
    django.setup()
  File "/usr/lib/python3/dist-packages/django/__init__.py", line 19, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "/usr/lib/python3/dist-packages/django/conf/__init__.py", line 82, in __getattr__
    self._setup(name)
  File "/usr/lib/python3/dist-packages/django/conf/__init__.py", line 69, in _setup
    self._wrapped = Settings(settings_module)
  File "/usr/lib/python3/dist-packages/django/conf/__init__.py", line 170, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 992, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
ModuleNotFoundError: No module named '/home/<username>/workspace/djangoapp/src/myproject/settings'

但是,我想最终将所有 django 脚本移动到

myproject/scripts
目录并从那里执行它们。 我做错了什么?

django python-module
1个回答
0
投票

当您在目录中运行此命令时:

python test_script_header.py

脚本的目录会自动添加到

sys.path
前面。因此,如果目录的形式为:

myproject
|- test_script_header.py
|- myproject
   |- settings.py

您可以使用

Python 路径语法
正确访问 settings 模块。

os.environ["DJANGO_SETTINGS_MODULE"] = "myproject.settings"

Django 可以正确定位该模块并读取所有

settings
变量。

但是如果

settings
模块不在脚本目录中,则必须添加其所在目录的确切路径,以便 Python 能够正确找到该模块。

例如,如果设置模块位于目录中:

/home/<username>/workspace/djangoapp/src/myproject/

将此目录添加到

sys.path
,以便Python在使用Python路径语法时可以正确定位该模块。

import sys
import os
import django

sys.path.insert(0, "/home/<username>/workspace/djangoapp/src/myproject/")
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
django.setup()
© www.soinside.com 2019 - 2024. All rights reserved.