我正在使用python ArgumentParser
来处理CLI程序的用户输入。这是一个名为smtp_mailer.py
的便捷脚本,用于通过SMTP协议发送电子邮件。我希望以两种方式使用CLI工具:
./smtp_mailer.py <JSON representation of the mail>
; ./smtp_mailer.py -u <user> -p <pass> -f <from> -t <to> ...
所以,我首先使用解析器来解析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
答案 0 :(得分:0)
parse_known_args
将'-u'
放入remaining_argv
,将'Ggicci'
放入args
。
由于json
是&#39;?&#39;位置,任何非标志字符串都计为一个值,如果没有,则“没有”&#39;比赛也是如此。如果您定义了--json
参数,那么您的测试会更可靠。