【问题标题】:Python: Handling multiple flags with argparsePython:使用 argparse 处理多个标志
【发布时间】:2018-04-03 05:14:37
【问题描述】:

当我执行 python myscript.py -i -i myfile.txt 输出应该是:

 info from file

 info from file

所以每次遇到标志时都会执行一段代码,即使它输出的是相同的数据。

目前它只是打印:

文件中的信息

parser = argparse.ArgumentParser()
parser.add_argument('-i', help="info", action='store_true')
parser.add_argument('filename', nargs='+')
results = parser.parse_args()

if results.i:
    print("info from file")

【问题讨论】:

标签: python argparse


【解决方案1】:

我的意思是我猜你可以这样做(如果我正确理解你的问题):

import sys
import argparse


def parse_i(args, to_parse):
    times_counted = 0
    for arg in args:
        if arg == to_parse:
            times_counted += 1
    return times_counted

if __name__ == "__main__":

    parser = argparse.ArgumentParser()
    parser.add_argument('-i', help="info", action='store_true')
    parser.add_argument('filename', nargs='+')
    results = parser.parse_args()

    for _ in range(0, parse_i(sys.argv, "-i")):
        if results.i:
            print("info from file")

一个例子是:

root@baal-Aspire-5733Z:~/bin/python/zeus-scanner# python file.py file -i 
info from file
root@baal-Aspire-5733Z:~/bin/python/zeus-scanner# python file.py file -i -i
info from file
info from file
root@baal-Aspire-5733Z:~/bin/python/zeus-scanner# python file.py file -i -i -i
info from file
info from file
info from file
root@baal-Aspire-5733Z:~/bin/python/zeus-scanner# python file.py file -i -i -i -i
info from file
info from file
info from file
info from file
root@baal-Aspire-5733Z:~/bin/python/zeus-scanner# 

【讨论】:

  • 如果像这样使用sys.argv,就跳过argparse的使用。直接从sys.argv获取文件名。
【解决方案2】:

使用“count”操作而不是“store_true”:

In [373]: parser = argparse.ArgumentParser()
In [374]: parser.add_argument('filename', nargs='+');
In [375]: parser.add_argument('-i', action='count');
In [376]: args = parser.parse_args('-i -i myfile.txt'.split())

In [377]: print(args)
Namespace(filename=['myfile.txt'], i=2)

In [378]: for i in range(args.i): print(args.filename)
['myfile.txt']
['myfile.txt']

没有-i

In [379]: args = parser.parse_args('myfile.txt'.split())
In [380]: print(args)
Namespace(filename=['myfile.txt'], i=None)

使用默认的None,您需要捕获None 的情况:

if args.i:
    # do the rest

将默认值设置为 0 会简化测试:

parser.add_argument('-i', action='count', default=0); 

【讨论】:

    猜你喜欢
    • 2017-08-30
    • 2012-07-15
    • 2020-04-13
    • 2016-04-16
    • 1970-01-01
    • 2017-11-26
    • 2014-02-12
    • 2014-07-09
    • 2020-10-23
    相关资源
    最近更新 更多