假设我有一个功能如下:
def foo(**kwargs):
print kwargs
Run Code Online (Sandbox Code Playgroud)
然后像这样调用函数,我得到了这个方便的小字典kwargs。
>>> foo(a = 5, b = 7)
{'a': 5, 'b': 7}
Run Code Online (Sandbox Code Playgroud)
我想直接对我从命令行调用的脚本执行此操作。所以输入这个:
python script.py a = 5 b = 7
Run Code Online (Sandbox Code Playgroud)
将创建与上述示例类似的字典。这能做到吗?
这是我到目前为止所拥有的:
import sys
kwargs_raw = sys.argv[1:]
kwargs = {key:val for key, val in zip(kwargs_raw[::3], kwargs_raw[1::3])}
print kwargs
Run Code Online (Sandbox Code Playgroud)
这是产生的结果:
Y:\...\Python>python test.py a = 5 b = 7
{'a': '5', 'b': '7'}
Run Code Online (Sandbox Code Playgroud)
所以你可能想知道为什么这还不够好
a或b其他内容,则将不起作用。我以前ast.literal_eval()在这里见过,但我不知道如何让它工作。我的两次尝试都失败了:
>>> ast.literal_eval("a = 5")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "Y:\admin\Anaconda\lib\ast.py", line 49, in literal_eval
node_or_string = parse(node_or_string, mode='eval')
File "Y:\admin\Anaconda\lib\ast.py", line 37, in parse
return compile(source, filename, mode, PyCF_ONLY_AST)
File "<unknown>", line 1
a = 5
Run Code Online (Sandbox Code Playgroud)
和
>>> ast.literal_eval("{a:5,b:7}")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "Y:\admin\Anaconda\lib\ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "Y:\admin\Anaconda\lib\ast.py", line 63, in _convert
in zip(node.keys, node.values))
File "Y:\admin\Anaconda\lib\ast.py", line 62, in <genexpr>
return dict((_convert(k), _convert(v)) for k, v
File "Y:\admin\Anaconda\lib\ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string
Run Code Online (Sandbox Code Playgroud)
如果重要的话,我在 Windows 7 64 位上使用 Python 2.7.6 32 位。提前致谢
看来您真正要寻找的是一种解析命令行参数的方法。看看argparse模块:http : //docs.python.org/2/library/argparse.html#module-argparse
或者,如果你真的想以字典形式给出你的参数,只需使用json模块:
import json, sys
# Run your program as:
# python my_prog.py "{'foo': 1, 'bar': 2}"
# (the quotes are important)
data = json.loads(sys.argv[1])
Run Code Online (Sandbox Code Playgroud)