我是Python的新手,我需要从命令行参数中读取bytestring。我正在使用Python 3.4。
目前,我正在使用argparse来解析参数,使用这种数据配置:python myprogram.py -d b'd\x00!\x00W\x00'
当我用-d参数调用我的程序时(例如'b\\'d\\x00!\\x00W\\x00\\''
),它将-d的值解释为字符串,转义斜杠并将'b'视为字符串的一部分,如下所示:{ {1}}
有没有办法从argparse中取消输出并将其转换为字节?
答案 0 :(得分:2)
你通常会让shell形成确切的字节,但是因为你cannot pass in NUL bytes as arguments要求用户传递转义序列是合理的解决方法。
但是,shell不会解释Python字节字符串文字表示法。
在这种情况下,我要求用户输入十六进制值:
python myprogram.py -d "64 00 21 00 57 00"
并使用binascii.unhexlify()
function从中生成bytes
值(首先删除任何空格):
whitespace = dict.fromkeys((9, 10, 13, 32)) # tab, space, newline and carriage return
data = binascii.unhexlify(args.data.translate(whitespace))
这需要您将默认参数值设置为兼容值:
parser.add_argument("-d", "--data", default='00')
另一种方法是使用ast.literal_eval()
function来解释Python字节字符串文字语法:
data = ast.literal_eval(args.data)
,默认为:
parser.add_argument("-d", "--data", default=repr(b'\0'))
但考虑到此函数接受任何Python文字,因此您最终可能会使用任何其他对象类型,包括数字,字符串和容器。