Django - 在哪里放argparse命令来修改-h选项?

时间:2016-11-30 11:55:02

标签: django command argparse

我想在我创建的项目中修改我的帮助选项。 我把argparse放在manage.py文件中,就像这个

一样
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)

但是当我运行python manage.py -h时它运行正常(帮助显示),但当我运行python manage.py runserver时,我得到了:manage.py: error: unrecognized arguments: runserver 如何解决这个问题呢?我真的不知道如何修改-h选项。

我应该在哪里放置argparse代码来获取这个django项目的帮助?我知道我可以使用自己的命令,但在我python manage.py -h

之后获得帮助对我很重要

修改

在评论的帮助下,我创建了:

#!/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()

2 个答案:

答案 0 :(得分:1)

你可能不应该在这里将argparse引入图片中。 Argparse和Argh非常有用,如果您正在编写django CLI但对添加自定义管理命令没有多大帮助,因为管理api已经构建了大部分要求,尽管方式非常不同。

例如,只需将.py文件放在正确的位置,即可自动执行命令,以便在执行./manage.py -h时显示。例如,如果您将文件创建为

myapp/management/commands/custom.py

执行manage.py -h将显示

[myapp]
    custom

您可以通过过度设置帮助变量来进一步自定义它。

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

现在./manage.py custom -h将揭示(除其他外)

Closes the specified poll for voting

答案 1 :(得分:1)

根据讨论添加新答案。

通过将__main__块下的内容移动到单独的功能,您可以让老师高兴。所以你在manage.py中有两个函数,第一个函数在参数为-h时调用,第二个函数在其他所有函数中调用。确保manage.py中的所有导入也移动到这些函数内部而不是位于顶层。

然后

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

其中main()包含标准的django manage.py代码。请注意,您现在不需要argparse,因为现在help_parser()只显示应用程序的帮助消息,而且没有其他任何操作。