2013-06-13 213 views
1
变量定义

我试图构建一个(一种模板/包装)的剧本,这就是所谓的一些不确定的选项命令行参数在Python

> the_script.py --foo=23 --bar=42 --narf=fjoord 

,然后创建了一个名为foo=23变量,bar=42 ,里面有narf='fjoord'

这样做的方法是什么?我尝试了getopt,但它需要第二个参数,所以我必须定义要获取的选项,当然,我希望能够通过命令行定义我的变量名称。我也尝试OptionParser,不知道如何处理未定义的选项。

那么手动解析sys.argv的方式,还是有可能是一个模块,它完全相同的事情?

+0

python-docopt是一个命令行参数解析模块。一探究竟! https://github.com/docopt/docopt – scarecrow

+0

@anandaseelan - 然后所有的命令行参数需要被预先知道... – mgilson

+0

只是好奇 - 一旦你想要做什么命令行选项拥有他们?语法总是'--foo = 23',或者它可能是'--foo 23'? – mgilson

回答

2

这是一个相对简单的任务,ast.literal_eval和字符串拆分 - 但只有当你有一个非常好定义的语法。 (例如,只允许--foo=bar--foo bar中的1个)。

import argparse 
import ast 

parser = argparse.ArgumentParser() #allow the creation of known arguments ... 

namespace,unparsed = parser.parse_known_args() 

def parse_arg(arg): 
    k,v = arg.split('=',1) 
    try: 
     v = ast.literal_eval(v) #evaluate the string as if it was a python literal 
    except ValueError:   #if we fail, then we keep it as a string 
     pass 

    return k.lstrip('-'),v 

d = dict(parse_arg(arg) for arg in unparsed) 
print(d) 

我把键值对放在字典中。如果你真的想把它们当作全局变量,你可以做globals().update(d) - 但是我会认真的反对这个建议。

+0

'globals()。update(d )'是让php陷入了许多麻烦的事情的类型 –

+0

@gnibbler - 正如我所说的,我严肃地建议不要这样做。弄清楚在这种情况下定义了哪些变量的唯一方法是检查'globals()'字典......不妨单独保存一个字典并使用它。 – mgilson

+0

我会更关心阴影建筑物的可能性。 –

3

使用此。也许你需要一些字符串'括号中的一些...

>>python yourfunc.py foo=4 abc=5 

import sys 
list=sys.argv[1:] 
for i in list: 
    exec(i)