如何使用python的argparse与预定义的参数字符串?

时间:2012-01-16 10:11:55

标签: python argparse

我想使用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。如前所述,如果我从终端传递文件名,它就可以工作。

我可以想象,这与字符串编码有关。有人知道如何解决这个问题吗?

4 个答案:

答案 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])