Как установить DJANGO_SETTINGS_MODULE с абсолютным путем к файлу settings.py

Мне нужно написать несколько скриптов для 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 и выполнять их оттуда. Что я делаю не так?

Когда вы запускаете эту программу в каталоге:

python test_script_header.py

Каталог скрипта автоматически добавляется к sys.path. В связи с этим, если каталог имеет вид:

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

Вы можете корректно получить доступ к модулю settings, используя синтаксис пути в Python.

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()
Вернуться на верх