我正在尝试构建一种(某种模板/包装器)脚本,该脚本使用一些未定义的选项调用
> the_script.py --foo=23 --bar=42 --narf=fjoord
然后在其中创建一个名为foo=23
,bar=42
,narf='fjoord'
的变量。
这样做的方法是什么?我尝试使用getopt
,但它需要第二个参数,所以我必须定义要获取的选项,当然,我希望能够通过命令行定义我的变量名。我也试过OptionParser
,但不知道如何处理未定义的选项。
手动解析sys.argv
的方式是什么,或者可能有一个模块,它完全相同?
答案 0 :(得分:3)
使用它。也许你需要一些字符串''括号...
>>python yourfunc.py foo=4 abc=5
import sys
list=sys.argv[1:]
for i in list:
exec(i)
答案 1 :(得分:2)
这是一个相对简单的任务ast.literal_eval
和字符串拆分 - 但只有你有一个非常明确的语法。 (例如,只允许--foo=bar
或--foo bar
中的一个。
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)
- 但我会认真反对。