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

12 投票
3 回答
13978 浏览
提问于 2025-04-16 15:21

我有一个脚本,它需要接收一个文件名和一组键=值的对。这组键=值的对是没有固定的,它们取决于传入的文件。

比如:

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 这些工具能实现吗,还是我需要自己写一个解析器?

3 个回答

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']

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)

output: [['fname', 'sameer'], ['sname', 'ali'], ['age', '29']]

newdict = dict(newlist)

print(newdict)

output: {'fname': 'sameer', 'sname': 'ali', 'age': '29'}
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”。

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 至少有两个参数。

撰写回答