我想使用带有多个命令行的argparser模块,其中一些模块应该没有参数。
示例:
parser.add_argument('-website', type=str, nargs='*')
parser.add_argument('-auth', type=str, nargs='*')
parser.add_argument('-dothis', action='store_true')
所以我想在命令行中调用以下命令:
- python script.py -website www.website.com www.website2.com -dothis
在这种情况下,-dothis命令只应用于第二个网站而不是第一个网站,但它用于两个网站。
另一个例子:
-python script.py -website www.website1.com www.website2.com -auth username/password
在这种情况下,第二个网站的身份验证不是第一个。
所以我想要的是:
- python script.py www.webstie1.com -dothis www.website2.com -auth u:p -dothis www.website3.com -auth u:p www.website4.com
或:
- python script.py -site www.website1.com -auth u:p -site www.website2.com -site www.website3.com -auth u2:p2
那么我的脚本如何知道哪个身份验证适用于哪个网站?
我该如何解决?
答案 0 :(得分:0)
您的示例不一致。一个人有'-website'有2个值,另一个有'-site'重复(追加行动?),第三个重复定位。
你的目标与argparse有几个基本问题:
usage
没有显示交互的规定我可以编写一组自定义Action类来执行您想要的那种交互。但你真的很感兴趣吗?
argparse
的基本解析策略是按顺序处理'positionals',但'optionals'(标记)参数可以按任何顺序发生。因此,生成的args
命名空间没有关于命令字符串顺序的信息。像getopt
和optparse
这样的旧解析器并没有好多少,因为它们专注于收集选项,并将其余部分作为无差别列表返回。
自定义Action类的替代方法是自己解析sys.argv
。只需遍历字符串即可。没有' - '的字符串是一个站点;以下任何“ - ”标志适用于该网站等。
对所需API的一种扭曲是将'--website'定义为带有多个参数的append
。
parser.add_argument('--website','-w','--site',dest='site',nargs='+',action='append',
help='website plus flags; may repeat')
可能的命令行和命名空间:
--site www.webwsite.com dothig --site www.website2.com
NS(site=[['www.website.con','dothis'],['website2']])
--site site1 username/pass --site site2
NS(site=[['site1','username/pass'],['site2']])
因此,对于args.site
中的每个元素,您可以将第1个项目解释为站点名称,然后解析其余部分以查找dothis
标记和auth
名称。