首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有store_true标志的可选子解析器

具有store_true标志的可选子解析器
EN

Stack Overflow用户
提问于 2013-10-03 03:04:26
回答 2查看 2.8K关注 0票数 0

如果我的术语取消了,请原谅我,但是我正在寻找一种方法,将子解析器添加到一个可选的arg解析参数中,每个arg上都有store_true标志。

理想情况下,我希望使用以下语法来引用--html子解析器中的布尔值:

代码语言:javascript
运行
复制
if args.shodan.html:
    print("Doing a thing") 

代码语言:javascript
运行
复制
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')

输出:

代码语言:javascript
运行
复制
(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')

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-03 16:44:46

代码语言:javascript
运行
复制
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的列表何时结束,子解析器(及其参数)何时开始?

代码语言:javascript
运行
复制
subparsers = parser.add_subparsers()
shodan_parser = subparsers.add_parser("shodan", help="SHODAN options")
...

你的输出

代码语言:javascript
运行
复制
(venv)[nott@admin gumdrop]$ python gumdrop.py google.ca --shodan --html
....

我猜这会让targets=['google.ca']shodan=True。但是您还没有给它一个子解析器命令。--html是个未知数。

代码语言:javascript
运行
复制
(venv)[nott@admin gumdrop]$ python gumdrop.py --shodan --html google.ca askjeeves.ca
...

现在设置shodan=True (主解析器标志)。同样,--html也是未知的。它设置了target=['google.ca']。但是现在它尝试将askjeeves.ca解释为子解析器命令。但它与可用的选择不匹配。

我想这些台词会管用的:

代码语言:javascript
运行
复制
python gumdrop.py google.ca askjeeves.ca shodan --html
python gumdrop.py --shodan google.ca shodan --html

我建议放弃整个子解析器位。对你和你的用户来说,这只是让人困惑的事情。继续,并在主解析器中包含--html。它是可选的,因此可以随意使用,也可以忽略它。您必须使用子解析器,查看文档,并尝试一些简单的示例。

至于获取args.shodan.html,这是一个更高级的问题,涉及名称空间的嵌套。现在,如果你得到了args.html,那就开心吧。

票数 0
EN

Stack Overflow用户

发布于 2013-10-03 04:14:44

您需要将开关从"-h“更改为其他东西(或禁用”帮助“),因为”帮助“菜单已经使用了"-h”开关。

代码语言:javascript
运行
复制
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")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19150074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档