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

tho*_*ink 16 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)
Run Code Online (Sandbox Code Playgroud)

如果我运行此脚本,我得到此输出:

~/someTestFile
usage: argparsetest.py [-h] param
argparsetest.py: error: unrecognized arguments: o m e T e s t F i l e
Run Code Online (Sandbox Code Playgroud)

~/someTestFile以某种方式在转变o m e T e s t F i l e.如前所述,如果我从终端传递文件名,它就可以工作.

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

Ser*_*rge 31

另一种选择是使用shlex.split.如果你有真正的CLI参数字符串,它会特别方便:

import shlex
argString = '-vvvv -c "yes" --foo bar --some_flag'
args = parser.parse_args(shlex.split(argString))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这非常有用.现在我可以从命令行以及其他python脚本运行! (2认同)

Dev*_*rre 26

啊,不,不,不.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'])


bol*_*old 7

只需split您的命令字符串:

args = parser.parse_args(argString.split())
Run Code Online (Sandbox Code Playgroud)

一个完整的例子来展示:

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)
Run Code Online (Sandbox Code Playgroud)

将输出:

Namespace(pic_resize=[128, 128])


yak*_*yak 5

就像默认值sys.argv是列表一样,您的参数也必须是列表。

args = parser.parse_args([argString])
Run Code Online (Sandbox Code Playgroud)