Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当加入短选项时,Python Argparse_known_args将失败_Python_Command Line Arguments_Argparse - Fatal编程技术网

当加入短选项时,Python Argparse_known_args将失败

当加入短选项时,Python Argparse_known_args将失败,python,command-line-arguments,argparse,Python,Command Line Arguments,Argparse,我正在使用argparse.ArgumentParser.parse_known_args在给定给外部实用程序的命令行上执行一些启发式操作,同时只在Python代码中指定其语法的相关部分。然而,当已知参数和未知参数以简短形式给出并在中连接在一起时(如在ls-lh中),它不会检测到它们。 例如: 有没有办法让它在这种情况下做出更好的启发?我通过编写一个函数来分离聚集在一起的参数(使用一些简化的假设),从而解决了这个问题: 我通过编写一个函数来解决这个问题,将聚集在一起的参数分开(使用一些简化的假设

我正在使用argparse.ArgumentParser.parse_known_args在给定给外部实用程序的命令行上执行一些启发式操作,同时只在Python代码中指定其语法的相关部分。然而,当已知参数和未知参数以简短形式给出并在中连接在一起时(如在
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']