解析包含字典的命令行参数
Parsing command line arguments containing dictionaries
我想将命令行参数传递给 python,其中包含这样的字典:
python server.py --keys '{"0x11": "f1.bin", "0x21": "f2.bin"}' --binaries '{"0x11": "dog.jpg", "0x21": "apple.jpg"}' -d '100' -p '1234'
我希望能够将这些字典的字符串表示形式转换为实际的 python 字典。
当我在主函数中打印出 argv 参数时,我得到一个如下所示的列表:
['--keys', "'{0x11:", 'f1.bin,', '0x21:', "f2.bin}'", '--binaries', "'{0x11:", 'cat.jpg,', '0x21:', "kitten.jpg}'", '-d', "'100'", '-p', "'1234'"]
这不是想要的输出。例如,请注意字典的键不再有引号。因此,我无法使用 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}'"]
有没有一种简单的方法可以实现我想要的输出?或者我是否需要编写自己的代码来更改 argv 的元素,使其在使用 json
或 ast
之前看起来像我想要的那样?
注意
莫里斯的解决方案是完美的。起初它引起了一点麻烦,直到他注意到我的问题实际上只发生在 Windows 上。在 Windows 上,我们必须用双引号将字典括起来,并像这样转义内部双引号:
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.
使用 argparse(不推荐使用 optparse),选项可以有类型(int
、str
、...)。但是您可以使用 json.loads
或 ast.literal_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)
从 CLI 调用:
python server.py --keys '{"0x11": "f1.bin", "0x21": "f2.bin"}' --binaries '{"0x11": "dog.jpg", "0x21": "apple.jpg"}' -d '100' -p '1234'
输出:
Namespace(binaries={'0x11': 'dog.jpg', '0x21': 'apple.jpg'}, d='100', keys={'0x11': 'f1.bin', '0x21': 'f2.bin'}, p='1234')
注:
在 Windows 上,您需要转义 JSON 字符串中的引号:
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 字典。
当我在主函数中打印出 argv 参数时,我得到一个如下所示的列表:
['--keys', "'{0x11:", 'f1.bin,', '0x21:', "f2.bin}'", '--binaries', "'{0x11:", 'cat.jpg,', '0x21:', "kitten.jpg}'", '-d', "'100'", '-p', "'1234'"]
这不是想要的输出。例如,请注意字典的键不再有引号。因此,我无法使用 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}'"]
有没有一种简单的方法可以实现我想要的输出?或者我是否需要编写自己的代码来更改 argv 的元素,使其在使用 json
或 ast
之前看起来像我想要的那样?
注意 莫里斯的解决方案是完美的。起初它引起了一点麻烦,直到他注意到我的问题实际上只发生在 Windows 上。在 Windows 上,我们必须用双引号将字典括起来,并像这样转义内部双引号:
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.
使用 argparse(不推荐使用 optparse),选项可以有类型(int
、str
、...)。但是您可以使用 json.loads
或 ast.literal_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)
从 CLI 调用:
python server.py --keys '{"0x11": "f1.bin", "0x21": "f2.bin"}' --binaries '{"0x11": "dog.jpg", "0x21": "apple.jpg"}' -d '100' -p '1234'
输出:
Namespace(binaries={'0x11': 'dog.jpg', '0x21': 'apple.jpg'}, d='100', keys={'0x11': 'f1.bin', '0x21': 'f2.bin'}, p='1234')
注:
在 Windows 上,您需要转义 JSON 字符串中的引号:
python server.py --keys "{\"0x11\": \"f1.bin\", \"0x21\": \"f2.bin\"}" --binaries "{\"0x11\": \"dog.jpg\", \"0x21\": \"apple.jpg\"}" -d '100' -p '1234'
输出: