【问题标题】:python - argparse multiple command-line how to knowpython - argparse 多个命令行怎么知道
【发布时间】:2015-10-20 05:38:36
【问题描述】:

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

那么我的脚本如何知道哪个网站的身份验证是什么?

我该如何解决?

【问题讨论】:

  • 为什么不使用不同的参数集调用脚本两次?这个脚本有什么意义?
  • @jonrsharpe 因为我只想每天运行一次。
  • 那么,我不确定标准的命令行界面是否可以帮助您。
  • 您的示例混合使用了-site、“-website”和“website”(具有不同名称和/或位置的选项)来输入名称。
  • 你想看什么样的usage消息?

标签: python arguments command-line-arguments argparse


【解决方案1】:

您的示例不一致。一个具有 2 个值的“-website”,另一个具有重复的“-site”(附加操作?),第三个重复的位置。

您的目标遇到了 argparse 的几个基本问​​题:

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

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

argparse 的基本解析策略是按顺序处理“位置”,但“可选”(标记)参数可以以任何顺序出现。因此,生成的 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 中的每个元素,您可以将第一项解释为站点名称,然后解析其余部分以找到dothis 标志和auth 名称。

【讨论】:

    猜你喜欢
    • 2014-10-08
    • 1970-01-01
    • 2017-01-31
    • 2021-05-04
    • 2019-08-25
    • 1970-01-01
    • 2012-09-06
    • 2016-09-02
    • 1970-01-01
    相关资源
    最近更新 更多