Как установить 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()