如果我的术语取消了,请原谅我,但是我正在寻找一种方法,将子解析器添加到一个可选的arg解析参数中,每个arg上都有store_true
标志。
理想情况下,我希望使用以下语法来引用--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')
有什么建议吗?
发布于 2013-10-03 16:44:46
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='+'
和子解析器中同时使用位置可能有效,但可能会造成混淆。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
。但是您还没有给它一个子解析器命令。--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
,那就开心吧。
发布于 2013-10-03 04:14:44
您需要将开关从"-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")
https://stackoverflow.com/questions/19150074
复制相似问题