2012-01-27 131 views
2

越来越参数我想从命令行得到三个参数:命令行蟒蛇

-o (for outputfile) -k (number of clusters) -l (data to be clustered) 

所以我写了这一点。

def get_input(): 
print 'ARGV  :', sys.argv[1:] 

options, remainder = getopt.getopt(sys.argv[1:], 'o:v:k:l', ['output=', 
                'verbose', 
                'k_clust=', 
                'limit=']) 
print "options ",options 
file_flag , k_flag, count_flag = False, False,False 
for opt, arg in options: 
    print opt 
    if opt in ('-o', '--output'): 
     print "here ", opt, arg 
     output_filename = arg 
     o_flag = True 

    if opt in ('-v', '--verbose'): 
     verbose = True 
    if opt == '--version': 
     version = arg 

    if opt in ('-k','--k_clust'): 
     print "here", opt, arg 
     k_clust = arg 
     k_flag = True 

    if opt in ('-l','--limit'): 
     kcount = arg 
     assert kcount!=0 and kcount!= '' 
     print "limit ", arg 
     count_flag = True 
if k_flag == False: 
    sys.exit(" no cluster specified, will be exiting now") 
if o_flag == False: 
    print "using default outfile name ",output_filename 
if count_flag == False: 
    kcount = 10000000 


return output_filename, k_clust,kcount 

一切工作的罚款,除了-l标志 所以如果我的命令行命令是这样的:

$python foo.py -o foo.txt -k 2 -l 2 

和打印的argv打印

ARGV  : ['-o', 'demo.txt', '-k', '2', '-l', '2'] 

但选项是:

options [('-o', 'demo.txt'), ('-k', '2'), ('-l', '')] 

请注意,在“l”字段中没有任何内容正在被解析。 笏我做错了吗? 谢谢

回答

9

getopt是一个相当老的模块。如果你有Python2.7,请使用argparse。 如果你的Python> = 2.3的稍微旧版本,你仍然可以install argparse

随着

import argparse 
parser=argparse.ArgumentParser() 
parser.add_argument('-o', help = 'outputfile') 
parser.add_argument('-k', help = 'number of clusters') 
parser.add_argument('-l', help = 'data to be clustered') 
args=parser.parse_args() 
print(args) 

运行

test.py -o foo.txt -k 2 -l 2 

产量

Namespace(k='2', l='2', o='foo.txt') 
4

这是因为在你的短裤参数:'o:v:k:l',“l”需要是fo由冒号“:”

因为它不是,“2”被放入余数变量。

+0

+1找到真正的问题(和解决方案)。 – unutbu 2012-01-27 20:46:45