2009-03-06 2 views
17

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

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

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

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 

ответ

10

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

+0

Спасибо за ответ, мне было слишком ленив, чтобы искать дополнительные команды управления раньше, но это именно то, что я хотел сделать, и помогает поддерживать все мои сценарии в одном месте. – MikeN

2

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

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

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

Don't forget the __init__.py file in the directory that has your settings.py – S.Lott

+0

Я обновил вопрос, есть еще ошибка, даже если параметр settings.py находится в пути. – MikeN

+0

Не забывайте файл __init__.py в каталоге с вашими настройками.py –

+0

Имеется файл __init__.py, который не работает. – MikeN

16

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

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

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

from django.conf import settings 

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

Я лично предпочитаю, чтобы установить мой DJANGO_SETTINGS_MODULE используя «/ USR/BIN/окр» в Баш скрипт под названием «proj_env», поэтому я не придется повторять это

#!/bin/bash 

proj_env="DJANGO_SETTINGS_MODULE=myproject.settings" 

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

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

proj_env python -m 'myproject.bin.myscript' 

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

и т.д. и т.п.

+0

Значит, каталог над каталогом проекта должен находиться на пути Python? И каталог проекта, содержащий settings.py, должен находиться в одном и том же имени каталога все время? Мой дев. название проекта отличается от моего производственного имени, имя каталога имеет временную метку на нем в процессе производства. – MikeN

+0

Мы помещаем наши настройки в/var/this и наши приложения в/opt/that. Наш PYTHONPATH есть «/ var/this:/opt/that». Настройки отдельно от приложений. –

+0

В приведенном выше примере пакет 'myproject' должен находиться на пути python, но это уже должно было быть для Django, чтобы найти его. Мой подход будет работать в вашей среде dev, но не уверен, какие настройки нужно делать с меткой времени. –

Смежные вопросы