我怎么能只解析位置参数后面的命令?
如果我有命令pythonfile.py -d dir -e test pos_cmd_1 -d
如何获取它,以便第一个-d
由argparse解析,而位置命令之后的所有内容均由该命令本身解析(基本上将pos_cmd_1 -d
读为单个参数)
这样参数列表将是
因此,位置命令之前的所有内容都是可选的。位置命令之后的所有内容都将成为位置命令本身的一部分。
编辑:当尝试用双破折号运行命令时,它告诉我后面的参数无法识别。
pythonfile.py -d testdir -e test -- command -d -s
它说-d -s
是无法识别的参数,而不是与命令捆绑在一起。
答案 0 :(得分:1)
您只需将命令行稍微更改为
pythonfile.py -d dir -e test -- pos_cmd_1 -d
通过添加--
,您告诉argparse停止寻找选项。因此,所有其余参数都在位置参数列表中设置。
另一种方法是引用其余参数:
pythonfile.py -d dir -e test "pos_cmd_1 -d"
(由于它仅创建一个位置参数),并且对分割后的字符串再次使用参数解析器(如果要在这些args中传递带引号的字符串,则不理想)
这些方法的优点是argparse
,getopt
本身支持它们,而且这是一种标准的机制,不会令您的命令用户感到惊讶。
如果您想坚持自己的方法,也许可以通过在一行中检测2个非选项参数来预处理参数列表以插入双破折号:
args = "-d dir -e test pos_cmd_1 -d".split()
oldarg=""
for i,a in enumerate(args):
if oldarg and oldarg[0]!='-' and a[0]!='-':
args.insert(i,'--')
break
oldarg = a
args
现在是:['-d', 'dir', '-e', 'test', '--', 'pos_cmd_1', '-d']
答案 1 :(得分:0)
使用简单的解析器:
[IS-HOME]/repository/database
它尝试解析最后一个'-d'并遇到错误。 In [2]: p = argparse.ArgumentParser()
In [3]: p.add_argument('-d');
In [4]: p.add_argument('-e');
In [5]: p.parse_args('-d dir -e test pos_cmd_1 -d'.split())
usage: ipython3 [-h] [-d D] [-e E]
ipython3: error: argument -d: expected one argument
没有帮助。
使用'-d'和'-e'以外的其他字符串parse_known_args
可以工作:
parse_known_args
具有In [7]: p.parse_known_args('-d dir -e test pos_cmd_1 -s'.split())
Out[7]: (Namespace(d='dir', e='test'), ['pos_cmd_1', '-s'])
nargs的位置似乎可以工作:
REMAINDER
In [8]: a1 = p.add_argument('rest', nargs='...') # argparse.REMAINDER
In [9]: p.parse_args('-d dir -e test pos_cmd_1 -s'.split())
Out[9]: Namespace(d='dir', e='test', rest=['pos_cmd_1', '-s'])
In [10]: p.parse_args('-d dir -e test pos_cmd_1 -d'.split())
Out[10]: Namespace(d='dir', e='test', rest=['pos_cmd_1', '-d'])
应该像'-'一样工作,捕获输入以供其他解析器或命令使用。
如果希望它能捕获整个命令行,则可能会出现问题,如:
REMAINDER