Argparse:带有store\u true标志的可选子parser

2024-05-20 15:27:18 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我的术语是关闭的,请原谅,但是我正在寻找一种方法来向可选的argparse参数添加一个subparser,并在每个参数上使用store_true标志。在

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

if args.shodan.html:
    print("Doing a thing") 

^{pr2}$

输出:

(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')

有什么建议吗?在


Tags: pyparser参数venvadminhtmlgoogleusage
2条回答

从“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="+")

{cder>与此子名称^有什么关系?它的目的是什么?你是不是把旗子和副手搞混了?在

助理也是一个职位。同时使用带nargs='+'的位置和子parser可能有效,但可能会导致混淆。targets列表何时结束,子parser(及其参数)何时开始?在

^{pr2}$

你的产出

(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解释为一个子parser命令。但它与可用的选择不匹配。在

我想这几行行行得通:

python gumdrop.py google.ca askjeeves.ca shodan  html
python gumdrop.py  shodan google.ca shodan  html

我建议你不要再犯了。这只是让你和你的用户感到困惑。继续并在主解析器中包含 html。它是可选的,所以可以随意使用或忽略它。如果您必须使用子参数,请查看文档,并尝试一些更简单的示例。在

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

相关问题 更多 >