【问题标题】:Django - where put argparse command to modify -h option?Django - 在哪里放置 argparse 命令来修改 -h 选项?
【发布时间】:2017-04-14 17:43:25
【问题描述】:

我想在我创建的项目中修改我的帮助选项。 我把 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 之后获得帮助对我来说很重要

编辑:

在 cmets 的帮助下,我创建了:

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

【问题讨论】:

    标签: django command argparse


    【解决方案1】:

    您可能不应该在此处将 argparse 引入图片中。如果您正在编写 django CLI,Argparse 和 Argh 非常有用,但对于添加自定义管理命令不是很有帮助,因为管理 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 custom -h 将显示(除其他外)

    Closes the specified poll for voting
    

    【讨论】:

    • 我明白了。但是,如果有人没有安装我在我的应用程序中包含的其他模块怎么办。然后当 manage.py custom -h 不显示帮助但错误列表时。即使出现错误,我如何显示帮助?
    • 我开始认为你真正想要创建的是一个 Django CLI 应用程序而不是一个 django web 应用程序
    • 我知道我有 requirements.txt。但这个应用程序的故事更复杂。这是我的学习应用程序,老师说即使出现错误列表,我也应该提供帮助。我知道这很愚蠢,但我想确定这是不可能的。那么,最好的方法是先从需求中安装所有模块,然后调用自定义帮助命令?
    • 相信我,我很生气。对不起,愚蠢的问题,但我需要确认这一点。我要告诉他,解决这个问题并获得帮助的唯一方法是安装所有需要的模块。感谢您的帮助
    • 想一想,您甚至可以通过将 __main__ 块下的内容移动到单独的函数来使其工作。因此,manage.py 中有两个函数,第一个函数在参数为 -h 时调用,第二个函数用于其他所有函数。确保 manage.py 中的所有导入也移动到这些函数内部,而不是位于顶层。
    【解决方案2】:

    根据讨论添加新答案。

    您可以通过将 __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() 仅显示您的应用程序的帮助消息,没有其他任何事情可做。

    【讨论】:

    • 很高兴能为您提供帮助,祝您的项目一切顺利
    猜你喜欢
    • 2021-04-20
    • 2016-01-10
    • 1970-01-01
    • 2019-11-03
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 2021-09-29
    相关资源
    最近更新 更多