[英]Argparse: optional subparsers with store_true flags
如果我的术语不正确,请原谅我,但我正在寻找一种向可选的argparse参数添加子解析器的方法,每个参数均带有store_true
标志。
理想情况下,我想使用以下语法在shodan_parser
解析器中引用--html
的布尔值:
if args.shodan.html:
print("Doing a thing")
parser = argparse.ArgumentParser()
parser.add_argument("-r", "--reverse-dns", help="rDNS on host", action="store_true")
parser.add_argument("-s", "--shodan", help="perform SHODAN query on discovered IPs", action="store_true")
parser.add_argument("targets", help="IPv4 addresses to search for", nargs="+")
subparsers = parser.add_subparsers()
shodan_parser = subparsers.add_parser("shodan", help="SHODAN options")
shodan_parser.add_argument("--html", action="store_true")
shodan_parser.set_defaults(which='shodan')
输出:
(venv)[nott@admin gumdrop]$ python gumdrop.py google.ca --shodan --html
usage: gumdrop.py [-h] [-r] [-e] [-s] targets [targets ...] {shodan} ...
gumdrop.py: error: too few arguments
(venv)[nott@admin gumdrop]$ python gumdrop.py --shodan --html google.ca askjeeves.ca
usage: gumdrop.py [-h] [-r] [-e] [-s] targets [targets ...] {shodan} ...
gumdrop.py: error: invalid choice: 'askjeeves.ca' (choose from 'shodan')
有什么建议么?
您需要将开关从“ -h”更改为其他名称(或禁用帮助),因为“ -h”开关已被帮助菜单使用
parser = argparse.ArgumentParser()
parser.add_argument("-r", "--reverse-dns", help="rDNS on host", action="store_true")
parser.add_argument("-s", "--shodan", help="perform SHODAN query on discovered IPs", action="store_true")parser.add_argument("targets", help="IPv4 addresses to search for", nargs="+")
subparsers = parser.add_subparsers()
shodan_parser = subparsers.add_parser("shodan", help="SHODAN options")
shodan_parser.add_argument("--html", action="store_true")
shodan_parser.set_defaults(which='shodan')
args = parser.parse_args()
if args.html:
print("Doing a thing")
parser = argparse.ArgumentParser()
parser.add_argument("-r", "--reverse-dns", help="rDNS on host", action="store_true")
parser.add_argument("-s", "--shodan", help="perform SHODAN query on discovered IPs", action="store_true")
parser.add_argument("targets", help="IPv4 addresses to search for", nargs="+")
这个--shodan
可选(标志)是否与子解析器名称有关? 目的是什么? 您是否将标志与子解析器混淆?
次级解析器也是一个位置。 同时使用nargs='+'
的位置和nargs='+'
解析器可能会起作用,但可能会造成混乱。 targets
列表何时结束,子解析器(及其参数)开始?
subparsers = parser.add_subparsers()
shodan_parser = subparsers.add_parser("shodan", help="SHODAN options")
...
您的输出
(venv)[nott@admin gumdrop]$ python gumdrop.py google.ca --shodan --html
....
我猜测这将设置targets=['google.ca']
, shodan=True
。 但是您没有给它一个subparser命令。 --html
是未知的。
(venv)[nott@admin gumdrop]$ python gumdrop.py --shodan --html google.ca askjeeves.ca
...
现在,您将shodan=True
设置为主解析器标志。 同样,-- --html
是未知的。 它设置了target=['google.ca']
。 但是现在,它尝试将askjeeves.ca
解释为子解析器命令。 但这与可用选项不匹配。
我认为这些行会起作用:
python gumdrop.py google.ca askjeeves.ca shodan --html
python gumdrop.py --shodan google.ca shodan --html
我建议删除整个子解析器。 对于您和您的用户而言,这只是令人困惑的事情。 继续,在主解析器中包括--html
。 它是可选的,因此可以随意使用或忽略。 您必须使用次级分析器,查看文档,然后尝试一些更简单的示例。
至于获取args.shodan.html
,这是一个更高级的问题,涉及名称空间的嵌套。 现在,如果您获得args.html
就感到高兴。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.