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

Python:将通用字典作为命令行参数传递,python,command-line-arguments,Python,Command Line Arguments,我有一个脚本,需要采用文件名和一组key=value对。未定义键=值对集。它们依赖于传入的文件 例如: 使用argparse/optparse可以实现这一点吗?或者我必须构建自己的解析器吗?这应该很容易自己解析。助手库的使用会因为事先不知道键而变得复杂。文件名位于sys.argv[1]中。可以使用以“=”字符作为分隔符拆分的字符串列表构建字典 import sys filename = sys.argv[1] args = dict([arg.split('=', maxsplit=1) for

我有一个脚本,需要采用文件名和一组key=value对。未定义键=值对集。它们依赖于传入的文件

例如:


使用argparse/optparse可以实现这一点吗?或者我必须构建自己的解析器吗?

这应该很容易自己解析。助手库的使用会因为事先不知道键而变得复杂。文件名位于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中至少有两个参数。

希望这有帮助,您可以将“转义”json字符串作为命令行参数传递,而不是传递dict

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”

以下是一个示例:

示例:1: 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 打印(sys.argv[1:]

ouput: ['fname=sameer', 'sname=ali', 'age=29']
newlist=[x.split('='),用于l中的x] 打印(新列表)

newdict=dict(newlist)

打印(newdict)


解析这大约是5行代码。这真的很重要吗?更简单:
dict(sys.argv[2:]中arg的arg.split('='))
谢谢你的提示,我将使用一个组合:`parser=argparse.ArgumentParser(description='testdictionary as args')parser.add_参数(“文件”)parser.add_参数(“dictionary”,nargs='*'))args=parser.parse_args()print args print args.dictionary print dict([x.split('=')表示args.dictionary中的x])“打印ARG.字典.Y.Syrasy````````````````````````.”这个解决方案只在没有键或值包含“=”字符的情况下工作.请考虑指定Max St==1,以确保在拆分每个ARG时只返回两个值.不是防弹的,而是比所提供的解决方案更好.rtunately maxsplit=1将不起作用,因为split不接受字符串的关键字。
for i in l:

    runarg = i.split('=')

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

print(d)

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