Python argparse在一个参数中有多个动作

时间:2014-03-30 21:43:50

标签: python arguments command-line-arguments argparse

我试图解决python的 argparse 功能

的问题

我想要实现的是,如果指定-k参数,则将其设置为其默认值(假设为5),但是如果设置了-k = 3,则&# 39; K'现在包含3 ...

以下是一个例子:

python3 test.py -k

命名空间(K == 5)

python3 test.py -k=3

命名空间(K == 3)

有可能得到这样的东西吗?

test.py

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-k ', metavar='n', type=int, default=5, dest='number')
args = parser.parse_args()
print(args)

提前致谢

2 个答案:

答案 0 :(得分:1)

这个怎么样:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-k',metavar='n', dest='number', action='append', nargs='?', const=5)
args = parser.parse_args()

print(args.number[0])

'python3 test.py -k'输出:

5

'python3 test.py -k = 3'输出:

3

使用sys的示例:

import sys

k = 5
for opt in sys.argv:
    if opt.split('=')[0] == '-k':
        if '=' in opt:
            print(opt.split('=')[1])
        if '=' not in opt:
            print(k)
    elif len(sys.argv) is 1:
        print('No arguments were supplied')

答案 1 :(得分:0)

这有点像黑客,但你可以用空格替换参数中的所有等号,然后在它们上使用argparse。如果您仍想使用argparse,例如,这可能会更好其他论据。

这意味着-k = 3和-k 3都可以。虽然-k = 3 = -k = 4 = -k也会被解析而没有错误。

改编自jmunsch的答案:

import argparse
import sys

# split all args with equal sign
args = []
for arg in sys.argv[1:]:
    args.extend(arg.split('='))

# parse the args
parser = argparse.ArgumentParser()
parser.add_argument('-k', metavar='n', type=int, dest='number',
                    action='append', nargs='?', const=5)
args = parser.parse_args(args)
print(args.number[0])

通过仅拆分以' -k ='开头的参数,可以使这更加智能化:

# split all args with equal sign
args = []
for arg in sys.argv[1:]:
    if arg[:2] == '-k=':
        args.extend(arg.split('='))
    else:
        args.append(arg)