3

python3 argparse 总是使用 -h 和 --help 作为帮助参数。现在我想使用 -h 和 --host 作为主机名参数。如何停止 argparse 以使用 -h 寻求帮助?

我知道在创建 ArgumentParse 实例时可以使用 add_help=False。但后来我开始处理我自己的 print_help 。像这样:

import os
import argparse
from inc import epilog


def ParseCommandLine():
    parser = argparse.ArgumentParser(
        description = "Network client program",
        epilog = epilog,
        add_help = False,
        )
    parser.add_argument(
        "--help",
        dest="help",
        action="store_true",
        help="show this help message and exit",
    )
    parser.add_argument(
        "-h", "--host",
        dest="host",
        action="store",
        help="target host",
        )
    parser.add_argument(
        "-p", "--port",
        dest="port",
        action="store",
        type=int,
        help="target port",
        )

    return parser, parser.parse_args()

def Main():
    parser, opt = ParseCommandLine()
    if opt.help:
        parser.print_help()
        os.sys.exit(0)

有用。但现在我想为主机和端口参数添加 required=True 。然后就破了。因为当您执行 python xxxx.py --help 时,argparse 看到您缺少所需的参数主机和端口,它只会向您抱怨,并且不显示帮助屏幕。

任何人都知道如何更改 argparse 帮助参数的默认 registry_name 吗?

4

2 回答 2

1

使用 conflict_handler='resolve' 覆盖 register_name。

import os
import argparse
from inc import epilog

def ParseCommandLine():
    parser = argparse.ArgumentParser(
        description = "Network client",
        epilog = epilog,
        conflict_handler='resolve'
        )
    parser.add_argument(
        "-w", "--crlf",
        dest="crlf",
        action="store_true",
        help="use CRLF at the end of line"
        )
    parser.add_argument(
        "-l", "--line",
        dest="line",
        action="store_true",
        help="send line by line",
        )
    parser.add_argument(
        "-h", "--host",
        dest="host",
        action="store",
        required=True,
        help="target host",
        )
    parser.add_argument(
        "-p", "--port",
        dest="port",
        action="store",
        type=int,
        required=True,
        help="target port",
        )
    return parser, parser.parse_args()

def Main():
    parser, opt = ParseCommandLine()


if __name__ == '__main__':
    Main()

让我们看看它是如何工作的

D:\pytools>python nc.py
usage: nc.py [--help] [-w] [-l] -h HOST -p PORT
nc.py: error: the following arguments are required: -h/--host, -p/--port

是的,它可以按我的意愿工作

D:\pytools>python nc.py --help
usage: nc.py [--help] [-w] [-l] -h HOST -p PORT

Network client

optional arguments:
  --help                show this help message and exit
  -w, --crlf            use CRLF at the end of line
  -l, --line            send line by line
  -h HOST, --host HOST  target host
  -p PORT, --port PORT  target port

Report nc.py bugs to http://www.truease.com/forum-66-1.html

是的,这也是我想要的。

于 2013-04-18T01:52:25.643 回答
0

您可以通过更改子类argparse.ArgumentParser化并覆盖该方法error

    self.print_usage(_sys.stderr)

    self.print_help(argparse._sys.stderr)

import argparse

class MyArgumentParser(argparse.ArgumentParser):
    def error(self, message):
        """error(message: string)

        Prints a usage message incorporating the message to stderr and
        exits.

        If you override this in a subclass, it should not return -- it
        should either exit or raise an exception.
        """
        self.print_help(argparse._sys.stderr)
        self.exit(2, argparse._('%s: error: %s\n') % (self.prog, message))

def parse_command_line():
    parser = MyArgumentParser(
        description="Network client program",
        # epilog = epilog,
        add_help=False,)
    parser.add_argument(
        "-h", "--host",
        dest="host",
        action="store",
        help="target host",
        required=True)
    parser.add_argument(
        "-p", "--port",
        dest="port",
        action="store",
        type=int,
        help="target port",)

    return parser, parser.parse_args()

parser, opt = parse_command_line()

顺便说一句,您不需要添加--help参数,因为如果您省略它并且用户 types --help,该error方法将被相同地调用。

于 2013-04-18T01:44:23.167 回答