Как импортировать файл Python settings.py проекта Django из подкаталога? - PullRequest
17 голосов
/ 06 марта 2009

Я создал подкаталог моего проекта Django под названием bin, куда я хочу поместить все скрипты Python для запуска из командной строки. Некоторые из этих сценариев должны импортировать файл моего проекта Django settings.py, который находится в родительском каталоге bin.

Как мне импортировать файл settings.py из подкаталога проекта?

Код, который я использую в своем сценарии командной строки для установки в «контекст Django» проекта:

from django.core.management import setup_environ
import settings
setup_environ(settings)

Это прекрасно работает, если скрипт находится в корневом каталоге моего проекта.

Я попробовал следующие два хака, чтобы импортировать файл 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

Ответы [ 3 ]

16 голосов
/ 07 марта 2009

Я думаю, что ваш подход может слишком усложнить то, что Django 1.x предоставляет для вас. Пока ваш проект находится в пути Python, вы можете установить переменную окружения DJANGO_SETTINGS_MODULE в верхней части вашего скрипта следующим образом:

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

В вашем скрипте командной строки, где вам нужно прочитать ваши настройки, просто импортируйте модуль настроек из 'django.conf', как вы делали бы это в коде вашего приложения:

from django.conf import settings

И, наконец, у вас есть настройки и среда с поддержкой Django для вашего скрипта.

Лично я предпочитаю устанавливать свой DJANGO_SETTINGS_MODULE, используя '/ usr / bin / env' в скрипте bash, называемом 'proj_env', поэтому мне не нужно его повторять

#!/bin/bash

proj_env="DJANGO_SETTINGS_MODULE=myproject.settings"

/usr/bin/env $proj_env ${*}

Теперь я могу запустить любой скрипт на Python с моим приложением Django в контексте:

proj_env python -m 'myproject.bin.myscript'

Если вы используете virtualenv, это также даст вам хорошее место для поиска сценария активации.

и т.д.. и т.д.

10 голосов
/ 07 марта 2009

Это на один уровень выше вашего вопроса, но, вероятно, лучшее решение здесь - реализовать ваши сценарии в виде пользовательских команд manage.py (django-admin.py) . Это дает вам все функциональные возможности Django (включая настройки) бесплатно без уродливого взлома путей, а также тонкости командной строки, такие как анализ параметров. Я никогда не видел веских причин для написания связанных с Django сценариев командной строки любым другим способом.

2 голосов
/ 06 марта 2009

Добавьте родительский каталог к ​​вашему пути:

import sys
sys.path.append('../')
import settings

Обновление от комментариев:

Не забудьте файл __init__.py в каталог с вашим settings.py - S.Lott

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...