在函数中声明解析器时如何打印argparse帮助消息?

问题描述 投票:0回答:2

我正在使用以下代码,如果不使用参数,我想显示帮助消息。但是当我使用

parser.print_help()
时,编译器返回
NameError: name 'parser' is not defined
。如果我使用
args.print_help()
,编译器将返回
AttributeError: 'Namespace' object has no attribute 'print_help'

import os,subprocess,argparse

def parse_args():
    parser = argparse.ArgumentParser(description='Generate a power comparision report.')
    # Define command-line arguments
    parser.add_argument('-t', dest='test', help='test1,tes2,...etc')
    return parser.parse_args() 

def main():
    args = parse_args()  
    
    if args.test is None :
        print("\n run will start for all test cases in 3 mins,\n following are the default values, use switches to change them")
        parser.print_help() 

if __name__ == "__main__":
    main()  

如果没有提供参数,我期待一种打印帮助消息的方法。

python
2个回答
1
投票

您需要稍微重构一下,以便 arg 解析发生在您想要打印帮助的地方。我通常这样构建事情:

#!/usr/bin/env python3

import sys
import os
import argparse

def main(args):
    # Do things with args...
        
if __name__ == "__main__":

    # Define command-line arguments
    parser = argparse.ArgumentParser(description='Generate a power comparison report.')
    parser.add_argument('-t', dest='test', help='test1,tes2,...etc')

    # Make sure we have some command line arguments
    if len(sys.argv) == 1:
        parser.print_help(sys.stderr)
        sys.exit(1)
    else:
        args = parser.parse_args()
        main(args)

简单说明:

  1. 当程序启动时,我们会检查上下文。如果我们直接运行脚本,(
    __name__ == "__main__"
    评估为
    True
    )我们设置我们的参数解析器。
  2. 然后我们检查是否有任何争论。如果
    sys.argv
    中只有一个参数(第一个始终是脚本的名称),那么我们知道没有传递其他参数,因此我们将帮助语句打印到
    stderr
    ,然后退出并显示错误代码.
  3. 否则,我们解析命令行参数并将它们传递给主函数。

0
投票

当您使用

parser.add_argument('-t', ...)
定义参数时,该参数被视为可选(因为它以
'-'
开头)。要使其成为必需,请将 required 关键字参数添加到
add_argument()
:

def parse_args():
    parser = ...
    parser.add_argument('-t', dest='test', help='test1,tes2,...etc', required=True)
    return parser.parse_args()

现在,如果您没有为

-t
参数指定值,您的程序将会抱怨

© www.soinside.com 2019 - 2024. All rights reserved.