为什么没有argparse让我以任何顺序添加可选参数?

时间:2017-11-21 00:36:44

标签: python argparse

在下面的代码中,我无法在操作(更新,黑名单,自动)之后添加-v和-p参数,可能是由于subparser。我怎样才能使它能以任何顺序添加这些可选参数?

    var url = "https://fotogaleri.haberler.com/unlu-sarkici-imaj-degistirdi-gorenler-gozlerine/"; 
    //I will get the images src values in .col-big div at this url. 
    var web = new HtmlWeb();
    var doc = web.Load(url);

    var htmlNodes = doc.DocumentNode.SelectNodes("//div[@class='col-big']//*/img");  
    //i am selecting all images in div.col-big. But there is nothing. 

    foreach (var node in htmlNodes)
    {       
        Console.WriteLine(node.Attributes["src"].Value);
    }

根据解析器,这是有效的:

parser = argparse.ArgumentParser(usage='pyfilter.py <file> <action> <options>')
parser.add_argument('file', help='blacklist file containing IPs', type=str)

subparsers = parser.add_subparsers(help='help', dest='action')

parser_update = subparsers.add_parser('update', help='update help')

parser_blacklist = subparsers.add_parser('blacklist', help='blacklist help')

parser_auto = subparsers.add_parser('auto', help='auto help')
parser_auto.add_argument('-i', '--interval', help='interval help')

parser.add_argument('-p', '--port', help='specify the port to block', type=int)
parser.add_argument('-v', '--verbose', help='write output to screen', nargs='?')
args = parser.parse_args()

然而,这会在更新&#39;

之后的每个参数产生错误
python3.5 testfilter.py /etc/blacklist.lst -p 22 -v yes update 

2 个答案:

答案 0 :(得分:0)

这就是你的解析器树的样子

parser
  |__ update
  |     |__ updateOpts
  |__ blacklist
  |__ auto
  |__ port
  |__ verbose

所以如果你做了更新,它将遍历updateOpts,它找不到端口或详细信息

答案 1 :(得分:0)

主解析器会识别file(必填),--port--verbose,以及子分析器选择{'update','auto'}

一旦遇到subparser参数,它就会将解析委托给该解析器。子解析器完成后,主解析器不会恢复解析。它报告subparser无法处理的字符串为无法识别。

因此,在调用subparser之前,所有用于主解析器的字符串都必须发生。

您可以使用parse_known_args解决此问题。然后,无法识别的args将在extras列表中返回,这可以通过另一个解析步骤来处理。

Add top level argparse arguments after subparser args

How do you get argparse to choose a default subparser?

通常argparse尝试以任何顺序允许选项(标记)参数。当存在变量narg位置时,存在一些限制,在这种情况下,存在子分析符。一旦您了解了代码的组织方式,这种行为就有意义了。