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

33 投票
4 回答
35981 浏览
提问于 2025-04-17 10:21

我想用Python的argparse模块来解析我的命令行参数字符串。这个方法在从终端传递参数时能正常工作,但如果是给定的字符串就不行了。

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 somehow被变成了o m e T e s t F i l e。正如之前提到的,如果我从终端传递文件名,这个方法是有效的。

我想这可能和字符串的编码有关。有没有人知道怎么解决这个问题?

4 个回答

7

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

args = parser.parse_args([argString])
58

另一个选择是使用 shlex.split。如果你有真实的命令行参数字符串,这个方法特别方便:

import shlex
argString = '-vvvv -c "yes" --foo bar --some_flag'
args = parser.parse_args(shlex.split(argString))
34

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']) 这样的格式。

撰写回答