python ArgumentParser在parse_known_args无法正常工作后需要可选参数

时间:2017-08-28 12:30:25

标签: python argparse

我正在使用python ArgumentParser来处理CLI程序的用户输入。这是一个名为smtp_mailer.py的便捷脚本,用于通过SMTP协议发送电子邮件。我希望以两种方式使用CLI工具:

  1. ./smtp_mailer.py <JSON representation of the mail>;
  2. ./smtp_mailer.py -u <user> -p <pass> -f <from> -t <to> ...
  3. 所以,我首先使用解析器来解析json位置参数。如果没有提供,我继续解析<user>/<port>/...个可选参数:

    def parse_args():
        # the positional argument `json`
        parser = ArgumentParser(add_help=False)
        parser.add_argument('json', nargs='?', help='json representation of the SMTP mail')
        args, remaining_argv = parser.parse_known_args()
    
        if args.json:
            return args
    
        # the optional arguments
        parent = parser
        parser = ArgumentParser(parents=[parent], description='Send plain text mail through SMTP protocol.')
        parser.add_argument('-H', '--host', type=str, help='SMTP host')
        parser.add_argument('-P', '--port', type=int, help='SMTP port')
        parser.add_argument('-u', '--user', type=str, required=True, help='SMTP username')
        parser.add_argument('-p', '--pass', type=str, required=True, help='SMTP password')
    
        parser.add_argument('-f', '--from', type=str, required=True, help='mail FROM')
        parser.add_argument('-t', '--to', type=str, required=True, help='mail TO')
        parser.add_argument('-c', '--cc', type=str, help='mail CC')
        parser.add_argument('-s', '--subject', type=str, required=True, help='mail SUBJECT')
        parser.add_argument('-b', '--body', type=str, required=True, help='mail BODY')
        parser.add_argument('-a', '--attachments', type=str, help='mail ATTACHMENTS')
        return parser.parse_args(remaining_argv)
    
    def main():
        print parse_pargs()
    

    但如果我没有提供json参数,解析器似乎无法正常工作。

    ./smtp_mailer.py -u "Ggicci"
    # output:
    Namespace(json='Ggicci')
    

    但是,我希望看到:

    usage: smtp_mailer.py [-h] [-H HOST] [-P PORT] -u USER -p PASS -f FROM -t TO
                          [-c CC] -s SUBJECT -b BODY [-a ATTACHMENTS]
    smtp_mailer.py: error: argument -p/--pass is required
    

1 个答案:

答案 0 :(得分:0)

parse_known_args'-u'放入remaining_argv,将'Ggicci'放入args

由于json是&#39;?&#39;位置,任何非标志字符串都计为一个值,如果没有,则“没有”&#39;比赛也是如此。如果您定义了--json参数,那么您的测试会更可靠。