Подтвердить что ты не робот

Как импортировать файл проекта 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
4b9b3361

Ответ 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