Python:将通用字典作为命令行参数传递

12

我有一个脚本需要接受一个文件名和一组键值对。这组键值对并没有被定义,它们取决于传入的文件。

例如:

Script.py file1 bob=1 sue=2 ben=3  # file 1 needs bob, sue, and ben

Script.py file2 mel=1 gorge=3 steve=3 # file 2 needs mel, gorge, and steve

我能否使用argparse/optparse实现这个功能或者我需要编写自己的解析器?


1
解析这个大概只需要5行代码.. 这真的很重要吗? - Robus
3个回答

20

这应该很容易自己解析。使用辅助库可能会因不知道键而变得复杂。文件名在sys.argv [1]中。您可以使用以“=”字符为分隔符的字符串列表构建字典。

import sys
filename = sys.argv[1]
args = dict([arg.split('=', maxsplit=1) for arg in sys.argv[2:]])
print filename
print args

输出:

$ Script.py file1 bob=1 sue=2 ben=3
file1
{'bob': '1', 'ben': '3', 'sue': '2'}

这就是要点了,但你可能需要更强大的解析方式来解析键值对,而不仅仅是拆分字符串。此外,在尝试提取文件名之前,请确保sys.argv中至少有两个参数。


2
更简单的写法:dict(arg.split('=') for arg in sys.argv[2:]) - kennytm
谢谢提示,我将采用以下组合:parser = argparse.ArgumentParser(description='Test dictionary as args') parser.add_argument("file") parser.add_argument("dictionary", nargs='*') args = parser.parse_args() print args print args.dictionary print dict([x.split('=') for x in args.dictionary]) print args.dictionary.__class__ - David Just
@KennyTM 是的,那样更好。我改了答案。 - Judge Maygarden
4
只要键或值中没有包含'='字符,此解决方案才能正常工作。考虑指定maxsplit=1,以确保在拆分每个参数时只返回两个值。这不是绝对可靠的,但比当前提供的解决方案更好。 - AJ.
@AJ 这正是我写下最后一段的原因。;) 此外,我按照你的建议添加了maxsplit,因为这是一个好的且简单的改进。 - Judge Maygarden
2
很遗憾,maxsplit=1不起作用,因为split不接受字符串的关键字。 - FrenchKheldar

0
希望这可以帮到您。与其传递一个字典,您可以将一个“转义”后的JSON字符串作为命令行参数传递。
import optparse
import json

parser = optparse.OptionParser()
parser.add_option("-t", "--test", dest="test", action="store", type="string")
options, _ = parser.parse_args()
my_dict = json.loads(options.test)
print my_dict['key1']

然后这样使用:

python test.py -t "{\"key1\":\"value1\",\"key2\":\"value2\"}"

这将输出"value1"


0

这里是一个例子:

例子:1:

# runline argument is : ./filename fname=sameer sname=ali age=29
import sys 

l = sys.argv[1:]

print(l)

l = ['fname=sameer', 'sname=ali', 'age=29']

l = ['名字=萨米尔','姓氏=阿里','年龄=29']

for i in l:

    runarg = i.split('=')

    d[runarg[0]] = runarg[1]

print(d)

{'fname': 'sameer', 'sname': 'ali', 'age': '29'}

示例:2

print(sys.argv[1:]

ouput: ['fname=sameer', 'sname=ali', 'age=29']

newlist = [x.split('=') for x in l] print(newlist)

新列表 = [x.split('=') for x in l] 打印新列表
output: [['fname', 'sameer'], ['sname', 'ali'], ['age', '29']]

新字典 = dict(新列表) print(新字典)
output: {'fname': 'sameer', 'sname': 'ali', 'age': '29'}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接