python - argparse多命令行如何知道

时间:2015-07-29 09:55:59

标签: python arguments command-line-arguments argparse

我想使用带有多个命令行的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

那么我的脚本如何知道哪个身份验证适用于哪个网站?

我该如何解决?

1 个答案:

答案 0 :(得分:0)

您的示例不一致。一个人有'-website'有2个值,另一个有'-site'重复(追加行动?),第三个重复定位。

你的目标与argparse有几个基本问​​题:

  • 选项以独立于订单的方式解析
  • 参数通常不会互动
  • usage没有显示交互的规定

我可以编写一组自定义Action类来执行您想要的那种交互。但你真的很感兴趣吗?

argparse的基本解析策略是按顺序处理'positionals',但'optionals'(标记)参数可以按任何顺序发生。因此,生成的args命名空间没有关于命令字符串顺序的信息。像getoptoptparse这样的旧解析器并没有好多少,因为它们专注于收集选项,并将其余部分作为无差别列表返回。

自定义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名称。