当加入短选项时,Python Argparse_known_args将失败
我正在使用argparse.ArgumentParser.parse_known_args在给定给外部实用程序的命令行上执行一些启发式操作,同时只在Python代码中指定其语法的相关部分。然而,当已知参数和未知参数以简短形式给出并在中连接在一起时(如在当加入短选项时,Python Argparse_known_args将失败,python,command-line-arguments,argparse,Python,Command Line Arguments,Argparse,我正在使用argparse.ArgumentParser.parse_known_args在给定给外部实用程序的命令行上执行一些启发式操作,同时只在Python代码中指定其语法的相关部分。然而,当已知参数和未知参数以简短形式给出并在中连接在一起时(如在ls-lh中),它不会检测到它们。 例如: 有没有办法让它在这种情况下做出更好的启发?我通过编写一个函数来分离聚集在一起的参数(使用一些简化的假设),从而解决了这个问题: 我通过编写一个函数来解决这个问题,将聚集在一起的参数分开(使用一些简化的假设
ls-lh
中),它不会检测到它们。
例如:
有没有办法让它在这种情况下做出更好的启发?我通过编写一个函数来分离聚集在一起的参数(使用一些简化的假设),从而解决了这个问题:
我通过编写一个函数来解决这个问题,将聚集在一起的参数分开(使用一些简化的假设):
我回答了一个类似的问题 正如我在那里指出的,
argparse
文档不保证按照您的需要处理这种类型的输入:
根据文件16.4.4.1。选项值语法
对于短选项(选项只有一个字符长),可以连接选项及其值:
只要最后一个选项(或其中任何一个)需要一个值,就可以使用单个前缀将多个短选项连接在一起:
在您的例子中,“z”既不是短期权,也不是短期权的值,因此它被拒绝
是的,对输入进行预处理是唯一的选择
'-xyz'其中'-x'和'-y'是已知的,但'z'不是已知的,这本身就是不明确的。它是'-x-y-z','-x-y-z','-x-y=z'
argparse
提出错误,而不是做出这些假设。我在上回答了一个类似的问题
正如我在那里指出的,argparse
文档不保证按照您的需要处理这种类型的输入:
根据文件16.4.4.1。选项值语法
对于短选项(选项只有一个字符长),可以连接选项及其值:
只要最后一个选项(或其中任何一个)需要一个值,就可以使用单个前缀将多个短选项连接在一起:
在您的例子中,“z”既不是短期权,也不是短期权的值,因此它被拒绝
是的,对输入进行预处理是唯一的选择
'-xyz'其中'-x'和'-y'是已知的,但'z'不是已知的,这本身就是不明确的。它是'-x-y-z','-x-y-z','-x-y=z'
argparse
引发错误,而不是做出以下假设之一
import argparse
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-x', action='store_true')
parser.add_argument('-y', action='store_true')
parser.parse_known_args(['-xy', '-z']) # OK, gives: (Namespace(x=True, y=True), ['-z']
parser.parse_known_args(['-xyz']) # Fails with: PROG: error: argument -y: ignored explicit argument 'z'
import itertools
import re
def normalizeShortFormArgs(args):
"Separate short form args clustered together (as in 'ls -lh') into individual args (as in 'ls -l -h')"
shortArgsRe = re.compile(r"\-(\w+)")
def normalizeToken(argToken):
m = shortArgsRe.match(argToken)
if m is None:
return (argToken,)
else:
return ("-" + c for c in m.group(1))
return type(args)(itertools.chain.from_iterable(map(normalizeToken, args)))
# Example: normalizeShortFormArgs(["-k", "-lhZ", "-", "--other"])
# Gives: ['-k', '-l', '-h', '-Z', '-', '--other']