2016-11-30 2 views
1

Я хотел бы изменить мою опцию помощи в проекте, который я создал. я поставил argparse в manage.py файл, как этотDjango - где поставить команду argparse для изменения опции -h?

parser = argparse.ArgumentParser(
    description="Some desc", 
    formatter_class=argparse.RawTextHelpFormatter 
) 
args = parser.parse_args() 
print(args) 

if __name__ == "__main__": 

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Reporter.settings") 
    try: 
     from django.core.management import execute_from_command_line 
    except ImportError: 
     # The above import may fail for some other reason. Ensure that the 
     # issue is really that Django is missing to avoid masking other 
     # exceptions on Python 2. 
     try: 
      import django 
     except ImportError: 
      raise ImportError(
       "Couldn't import Django. Are you sure it's installed and " 
       "available on your PYTHONPATH environment variable? Did you " 
       "forget to activate a virtual environment?" 
      ) 
     raise 
    execute_from_command_line(sys.argv) 

, но когда я бегу питона manage.py -h работает правильно (помощь показывает), но когда я бегу python manage.py runserver, я получил: manage.py: error: unrecognized arguments: runserver Как решите эту проблему? Я действительно не знаю, как изменить параметр -h.

Где я могу поместить код argparse, чтобы получить помощь в этом проекте django? Я знаю, что я могу использовать собственную команду, но это очень важно для меня, чтобы получить помощь после того, как я сделать python manage.py -h

EDIT:

После помощи от комментариев, я создал:

#!/usr/bin/env python 


def help_parser(): 
    import argparse 
    parser = argparse.ArgumentParser("Some desc", 
     formatter_class=argparse.RawTextHelpFormatter 
    ) 
    args = parser.parse_args() 
    print(args[0]) 


def main(): 
    import os 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Reporter.settings") 
    try: 
     from django.core.management import execute_from_command_line 
    except ImportError: 
     # The above import may fail for some other reason. Ensure that the 
     # issue is really that Django is missing to avoid masking other 
     # exceptions on Python 2. 
     try: 
      import django 
     except ImportError: 
      raise ImportError(
       "Couldn't import Django. Are you sure it's installed and " 
       "available on your PYTHONPATH environment variable? Did you " 
       "forget to activate a virtual environment?" 
      ) 
     raise 
    execute_from_command_line(sys.argv) 


if __name__ == "__main__": 
    import sys 

    if sys.argv[1] == '-h': 
     help_parser() 
    else: 
     main() 

ответ

1

Вы, вероятно, не следует вводить в картину рисунки. Argparse и Argh довольно полезны, если вы пишете django CLI, но не очень полезны для добавления пользовательской команды управления, потому что у администратора api есть большинство требований, уже встроенных, хотя и совершенно по-другому.

Например, вы можете автоматически получить команду, чтобы показать, когда ./manage.py -h выполняется, просто разместив файл .py в нужном месте. Например, если вы создаете файл как

myapp/management/commands/custom.py 

выполнение manage.py -h покажет

[myapp] 
    custom 

Вы можете настроить его дальше, через установку переменной справки.

class Command(BaseCommand): 
    help = 'Custom help message here' 

Теперь ./manage.py пользовательские -h покажет (среди прочего)

Closes the specified poll for voting 
+0

Я понимаю. Но что, если кто-то не установил дополнительные модули, которые я включил в свое приложение. Затем, когда manage.py custom -h не отображает справку, а список ошибок. Как я могу показать помощь, даже если появились ошибки? – allocer

+0

Я начинаю думать, что вы действительно пытаетесь создать приложение Django CLI, а не веб-приложение django. – e4c5

+0

Я знаю, что у меня есть требования. Txt. но история этого приложения сложнее.Это приложение для изучения, и учитель сказал, что я должен показать помощь, даже если появится список ошибок. Я знаю, что это глупо, но я хочу быть уверенным, что это невозможно. Ну, лучший способ - сначала установить все модули из требований, а затем вызвать команду специальной справки? – allocer

1

Добавление нового ответа, основанного на обсуждении.

Вы можете сохранить своего учителя счастливым, перемещая то, что находится под блоком __main__, к отдельной функции. Таким образом, у вас есть две функции в manage.py, первая вызвана get, когда аргумент -h, второй для всего остального. Убедитесь, что все импорт в manage.py также перемещен внутри этих функций, а не находится на верхнем уровне.

Затем

if __name__ == "__main__": 
    import sys 
    if len(sys.argv) == 2 and sys.argv[1] == '-h': 
     help_parser() 
    else: 
     main() 

где основная() содержит стандартный DJANGO manage.py код. Обратите внимание, что здесь вам не нужен argparse, потому что теперь help_parser() отображает только справочное сообщение для вашего приложения и не имеет ничего другого.

+0

Да, спасибо;) – allocer

+0

рад помочь, все лучшее с вашим проектом – e4c5