2014-03-30 26 views
3

我试图解决一个问题中Python的argparse功能的Python argparse与多个动作一个参数

我想实现的是,如果指定-k参数,它设置为默认值(假设5),但是如果-k = 3时, '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) 

在此先感谢

+0

嗨罗伯特,我已经编辑后 – jpact

+1

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 =' 开始只分裂ARGS进行更加智能化:

从jmunsch的回答改编如果没有'-k'怎么办?你想要什么价值? – hpaulj

回答

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') 
+0

感谢您的回应,但它的工作原理是,问题是'k'和数字之间必须有'='符号:/ 所以可能的选项有: -k = x(k包含用户定义的数字) -k(k包含默认定义的数字) – jpact

+0

@Creck使用'sys'添加了一个工作版本 – jmunsch

+0

@Creck'-k'标志有一个尾随空白我更新了现在应该使用的argparse版本 – jmunsch

0

这是一个黑客攻击的一位,但你可以用空格替换所有的参数等号,然后对他们使用argparse。如果你想继续使用argparse,这可能会更好。为其他论点。

这意味着-k = 3和-k 3都会起作用。虽然也-k = 3 = -k = 4 = -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) 
+0

感谢您的回应,但是,我必须阻止接受像你上面提到的选项:( – jpact

相关问题