Python 解析包含字典的命令行参数

Python 解析包含字典的命令行参数,python,command-line,command-line-arguments,Python,Command Line,Command Line Arguments,我想将命令行参数传递给包含以下词典的python: python server.py --keys '{"0x11": "f1.bin", "0x21": "f2.bin"}' --binaries '{"0x11": "dog.jpg", "0x21": "apple.jpg"}' -d '100' -p '1234' 我希望能够将这

我想将命令行参数传递给包含以下词典的python:

python server.py --keys '{"0x11": "f1.bin", "0x21": "f2.bin"}' --binaries '{"0x11": "dog.jpg", "0x21": "apple.jpg"}' -d '100' -p '1234'
我希望能够将这些字典的字符串表示形式转换为实际的python字典

当我在main函数中打印argv参数时,我得到一个如下列表:

['--keys', "'{0x11:", 'f1.bin,', '0x21:', "f2.bin}'", '--binaries', "'{0x11:", 'cat.jpg,', '0x21:', "kitten.jpg}'", '-d', "'100'", '-p', "'1234'"]
python server.py --keys "{\"0x11\": \"f1.bin\", \"0x21\": \"f2.bin\"}" --binaries"{\"0x11\": \"dog.jpg\", \"0x21\": \"apple.jpg\"}" -d '100' -p '1234'
Huge thanks to him, because I never would have figured this issue out on my own.
这不是期望的输出。例如,请注意字典的键周围不再有引号。因此,我无法使用
json
ast
包将字典的字符串表示形式转换为实际字典。我想知道字典的整个字符串表示是否是列表中的单个元素,以及它们的结构是否被保留

我尝试过使用
optparse
包,但是,这也没有帮助。下面是我如何尝试的:

def main(argv):

    parser = optparse.OptionParser()
    parser.add_option('--keys')
    parser.add_option('--binaries')
    parser.add_option('-d')
    parser.add_option('-p')

    options, args = parser.parse_args()
    print(argv)
    print(options)
    print(args)
这将提供以下输出:

['--keys', "'{0x11:", 'f1.bin,', '0x21:', "f2.bin}'", '--binaries', "'{0x11:", 'cat.jpg,', '0x21:', "kitten.jpg}'", '-d', "'100'", '-p', "'1234'"]
{'keys': "'{0x11:", 'binaries': "'{0x11:", 'd': "'100'", 'p': "'1234'"}
['f1.bin,', '0x21:', "f2.bin}'", 'cat.jpg,', '0x21:', "kitten.jpg}'"]
有没有一个简单的方法来实现我想要的输出?或者在使用
json
ast
之前,我是否需要编写自己的代码来改变argv的元素,使其看起来像我想要的那样


注意 莫里斯的解决方案是完美的。一开始它引起了一点小麻烦,直到他注意到我的问题实际上只发生在Windows上。在Windows上,我们必须用双引号将字典括起来,并对内部双引号进行如下转义:

['--keys', "'{0x11:", 'f1.bin,', '0x21:', "f2.bin}'", '--binaries', "'{0x11:", 'cat.jpg,', '0x21:', "kitten.jpg}'", '-d', "'100'", '-p', "'1234'"]
python server.py --keys "{\"0x11\": \"f1.bin\", \"0x21\": \"f2.bin\"}" --binaries"{\"0x11\": \"dog.jpg\", \"0x21\": \"apple.jpg\"}" -d '100' -p '1234'
Huge thanks to him, because I never would have figured this issue out on my own.

使用(不推荐使用optpasse),选项可以有一个类型(
int
str
,…)。但是您可以使用
json.loads
ast.literal\u eval
作为
type
来解析json字符串:

import ast
import json
import argparse

parser = argparse.ArgumentParser(description='JSON TEST')
parser.add_argument('--keys', type=ast.literal_eval)
parser.add_argument('--binaries', type=json.loads)
parser.add_argument('-d', type=str)
parser.add_argument('-p', type=str)

args = parser.parse_args()
print(args)
python server.py --keys "{\"0x11\": \"f1.bin\", \"0x21\": \"f2.bin\"}" --binaries "{\"0x11\": \"dog.jpg\", \"0x21\": \"apple.jpg\"}" -d '100' -p '1234'
从CLI调用:

python server.py --keys '{"0x11": "f1.bin", "0x21": "f2.bin"}' --binaries '{"0x11": "dog.jpg", "0x21": "apple.jpg"}' -d '100' -p '1234'   
输出:

注意:
在Windows上,您需要转义JSON字符串中的引号:

import ast
import json
import argparse

parser = argparse.ArgumentParser(description='JSON TEST')
parser.add_argument('--keys', type=ast.literal_eval)
parser.add_argument('--binaries', type=json.loads)
parser.add_argument('-d', type=str)
parser.add_argument('-p', type=str)

args = parser.parse_args()
print(args)
python server.py --keys "{\"0x11\": \"f1.bin\", \"0x21\": \"f2.bin\"}" --binaries "{\"0x11\": \"dog.jpg\", \"0x21\": \"apple.jpg\"}" -d '100' -p '1234'
输出:


这给了我以下输出:
'{0x11:^SyntaxError:EOL在扫描字符串文字时
复制和粘贴您在问题中提到的CLI命令对我在Python27/38和39上工作正常。我当前正在运行python 3.7如果我在第一次调用中将parse.add_参数的类型更改为json.loads,错误将更改为
server.py:error:argument--key:invalid loads v值:“{0x11:”
能否显示在CLI上执行的内容(整个命令)?