我想使用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)
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'])
只需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])
就像默认值sys.argv是列表一样,您的参数也必须是列表。
args = parser.parse_args([argString])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13453 次 |
| 最近记录: |