django-admin.py не находит команд управления, но manage.py находит

У меня есть проект Django с командами управления под названием "listen_rfid" и "listen_qr". Они оба появляются в

./manage.py help --settings=imagination.idmapper.config.settings_dev

но ни один не появляется в

django-admin.py help --settings=imagination.idmapper.config.settings_dev
  • Я сравнил вывод diffsettings из django-admin.py и manage.py, и нет никаких различий.
  • Мои приложения правильно перечислены в INSTALLED_APPS.
  • DJANGO_SETTINGS_MODULE установлен одинаково в моей среде и в manage.py.
  • Я могу импортировать свои команды управления как модуль python и запускать их из оболочки django-admin.py.
  • Я работаю в virtualenv, но в нем установлена ​​команда django-admin.py, о чем свидетельствует "which django-admin.py".

Какие могут быть возможные причины того, что django-admin.py действует иначе, чем manage.py?

Я использую Django 1.5.5 в Ubuntu 12.04


person Ellis Percival    schedule 09.01.2014    source источник
comment
Просто чтобы быть уверенным, если вы сделаете $ which django-admin.py, вы получите тот из своего virtualenv, верно?   -  person ptr    schedule 09.01.2014
comment
ваш PYTHONPATH установлен правильно? попробуйте export PYTHONPATH=/path/to/project   -  person ptr    schedule 09.01.2014
comment
Мой вышеупомянутый комментарий предполагал, что вы были на Linux, кстати, извиняюсь за это. В любом случае вам нужно убедиться, что каталог вашего проекта находится на PYTHONPATH, что-то, что manage.py делает автоматически, а django-admin.py - нет.   -  person ptr    schedule 09.01.2014
comment
Да, мой каталог проектов находится на PYTHONPATH. manage.py, похоже, не устанавливает это, только DJANGO_SETTINGS_MODULE: pastebin.com/wXmNwamb   -  person Ellis Percival    schedule 09.01.2014


Ответы (2)


Согласно документации

django-admin.py - это утилита командной строки Django для административных задач. Этот документ описывает все, что он может делать.

Кроме того, в каждом проекте Django автоматически создается manage.py. manage.py - это тонкая оболочка вокруг django-admin.py, которая позаботится о двух вещах за вас перед делегированием django-admin.py:

1) Он помещает пакет вашего проекта в sys.path. 2) Он устанавливает переменную среды DJANGO_SETTINGS_MODULE так, чтобы она указывала на файл settings.py вашего проекта. 3) Он вызывает django.setup () для инициализации различных внутренних компонентов Django.

Возможно, проблема в пункте 1 или 3. Кстати, я всегда без проблем использовал ./manage.py в django 1.5.

https://docs.djangoproject.com/en/dev/ref/django-admin/

person geekazoid    schedule 09.01.2014
comment
Да, я читал это, но не уверен, что это правильно. pastebin.com/wXmNwamb ‹- это код в моем manage.py (который работает), но не нигде не устанавливаю sys.path. Он также не вызывает django.setup ()! - person Ellis Percival; 09.01.2014
comment
@Flyte Какую версию django вы используете? - person geekazoid; 09.01.2014
comment
Я использую django 1.5.5 - person Ellis Percival; 09.01.2014

Наконец-то нашел ответ на этот вопрос! Вот цитата из отчета об ошибке django:

django.core.management.find_management_module () загружает пользовательские команды для manage.py, находя путь к модулю и напрямую исследуя файл. Это не удается, когда приложения находятся в пакетах с общим базовым именем, но файлы НЕ находятся в одних и тех же каталогах, например:

  • приложение 1: company.division.project_a.app1 хранится в пути packages / company.subdivision.project_a.app1
  • приложение 2: company.division.project_b.app2 хранится в пути packages / company.subdivision.project_b.app2

Пользовательские команды в приложении 2 не будут найдены.

person Ellis Percival    schedule 22.09.2014