我想使用pythons argparse模块来解析我的cli参数字符串。这适用于从终端传递的参数,但不适用于给定的字符串。
import argparse
parser = argparse.ArgumentParser(description='Argparse Test script')
parser.add_argument("param", help='some parameter')
argString = 'someTestFile'
print(argString)
args = parser.parse_args(argString)
如果我运行此脚本,我会收到此输出:
~/someTestFile
usage: argparsetest.py [-h] param
argparsetest.py: error: unrecognized arguments: o m e T e s t F i l e
~/someTestFile
以某种方式改变o m e T e s t F i l e
。如前所述,如果我从终端传递文件名,它就可以工作。
我可以想象,这与字符串编码有关。有人知道如何解决这个问题吗?
答案 0 :(得分:28)
另一种选择是使用shlex.split。如果你有真正的CLI参数字符串,它会特别方便:
import shlex
argString = '-vvvv -c "yes" --foo bar --some_flag'
args = parser.parse_args(shlex.split(argString))
答案 1 :(得分:24)
啊,不,不,不。 parser.parse_args()
期望序列的格式与sys.argv[1:]
相同。如果您将字符串视为sys.argv序列,则会得到['s', 'o', 'm', 'e', 'T', 'e', 's', 't', 'F', 'i', 'l', 'e']
。 's'成为相关的参数,然后字符串的其余部分是不可解析的。
相反,您可能希望传入parser.parse_args(['someTestFile'])
答案 2 :(得分:4)
就像默认的sys.argv
是一个列表一样,你的参数也必须是一个列表。
args = parser.parse_args([argString])
答案 3 :(得分:0)
只需split
您的命令字符串:
args = parser.parse_args(argString.split())
展示的完整示例:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--dummy_opt', nargs='*', type=int, help='some ids')
argString = "--dummy_opt 128 128"
args = parser.parse_args(argString.split())
print(args)
将输出:
Namespace(pic_resize=[128, 128])