dimanjy
@dimanjy
Недопрограммист и полуинженер.

Как запустить Django из другой директории?

Известно, что manage.py лежит в корневой папке проекта Django PRJ_ROOT/.

Я хочу сделать "запускалку" в одной из вложенных папок, например, в PRJ_ROOT/bin/.
Пишу "запускалку":
import os
import django.conf

# Определяю папку "запускалки" и иду на уровень выше из bin в PRJ_ROOT
_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../'))

# Меняю рабочую директорию на корень PRJ_ROOT
os.chdir(_dir)

print _dir # Выводит PRJ_ROOT
print os.getcwd() # Выводит PRJ_ROOT

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
django.setup()


И выдает ошибку, что не может импортировать модуль project.settings!

Если кладу "запускалку" вместе с manage.py и убираю из нее os.chdir(), то "запускалка" работает нормально.

А почему из другой папки не работает??? Ведь os.chdir() устанавливается правильно - в корень проекта, там где и manage.py лежит?
  • Вопрос задан
  • 448 просмотров
Решения вопроса 1
dimanjy
@dimanjy Автор вопроса
Недопрограммист и полуинженер.
Спасибо Павлу, разобрался!
Проблема была действительно в путях, которые откладываются в sys.path. Чтобы запустить консольный модуль Django из произвольной папки, нужно убрать из sys.path путь к этой папке и добавить путь к корню Django-проекта:
import sys
import os
import django.conf

_curdir = os.path.abspath(os.path.dirname(__file__))        # Текущая директория
_newdir = os.path.abspath(os.path.join(_curdir, '../../../')) # Путь к корню Django-проекта

sys.path.remove(_curdir)     # Удаляем текущий путь
sys.path.insert(0, _newdir)  # Добавляем путь к корню

# Запускаем Django-окружение
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'unit.settings')
django.setup()

# Дальше работаем с Django-моделями и делаем все, что нужно
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы