关于Django:Django-在哪里放argparse命令修改-h选项?

Django - where put argparse command to modify -h option?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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选项。

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

之后获得帮助

编辑:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/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()

根据讨论添加新答案。

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

然后

1
2
3
4
5
6
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()仅显示应用程序的帮助消息,而无需执行其他任何操作。


您可能不应该在这里将argparse引入图片。如果您正在编写django CLI,则Argparse和Argh非常有用,但是对于添加自定义管理命令不是很有帮助,因为管理api已经以不同的方式建立了大多数已内置的需求。

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

1
myapp/management/commands/custom.py

执行manage.py -h将显示

1
2
[myapp]
    custom

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

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

现在./manage.py自定义-h将显示(以及其他内容)

1
Closes the specified poll for voting