Как импортировать файл проекта Django settings.py Python из подкаталога?
Я создал подкаталог моего проекта Django под названием bin
, где я хочу поместить все скрипты Python в командной строке. Некоторым из этих сценариев необходимо импортировать файл Django project settings.py
, который находится в родительском каталоге bin
.
Как я могу импортировать файл settings.py
из подкаталога проекта?
Код, который я использую в моей командной строке script для установки в "контексте Django" проекта:
from django.core.management import setup_environ
import settings
setup_environ(settings)
Это отлично работает, если script находится в корневом каталоге моего проекта.
Я попробовал следующие два хака, чтобы импортировать файл settings.py
, а затем настроить проект:
import os
os.chdir("..")
import sys
sys.path = [str(sys.path[0]) + "/../"] + sys.path
Жестокий хак может импортировать settings.py
, но затем я получаю сообщение об ошибке:
project_module = __import__(project_name, {}, {}, [''])
ValueError: Empty module name
Ответы
Ответ 1
Это идет на один уровень выше вашего вопроса, но, вероятно, лучшим решением здесь является реализация ваших скриптов как custom manage.py(django-admin.py ) команды. Это дает вам всю функциональность Django (включая настройки) бесплатно без уродливого взлома пути, а также тонкостей командной строки, таких как разбор параметров. Я никогда не видел хорошей причины писать Django-связанные сценарии командной строки любым другим способом.
Ответ 2
Я думаю, что ваш подход может чрезмерно усложнять то, что Django 1.x предоставляет вам. Пока ваш проект находится на вашем пути python, вы можете установить переменную среды DJANGO_SETTINGS_MODULE в верхней части вашего script следующим образом:
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
В командной строке script, где вам нужно прочитать ваши настройки, просто импортируйте модуль настроек из "django.conf", как это было бы в коде вашего приложения:
from django.conf import settings
И у вас есть свои настройки и среда с поддержкой Django для вашего script.
Я лично предпочитаю устанавливать свой DJANGO_SETTINGS_MODULE с помощью '/usr/bin/env' в bash script, называемом 'proj_env', поэтому мне не нужно его повторять
#!/bin/bash
proj_env="DJANGO_SETTINGS_MODULE=myproject.settings"
/usr/bin/env $proj_env ${*}
С этим теперь я могу запустить любой python script с моим приложением Django в контексте:
proj_env python -m 'myproject.bin.myscript'
Если вы используете virtualenv, это также дает вам хорошее место для активации активации script.
и т.д.. и др.
Ответ 3
Добавьте родительский каталог в свой путь:
import sys
sys.path.append('../')
import settings
Обновление от комментариев:
Не забывайте файл __init__.py
в каталог, в котором есть settings.py - S.Lott