Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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仅在位置参数之前解析_Python_Argparse_Argv - Fatal编程技术网

Python Argparse仅在位置参数之前解析

Python Argparse仅在位置参数之前解析,python,argparse,argv,Python,Argparse,Argv,如何让argparse只解析位置参数后面的命令 如果我有命令pythonfile.py-d dir-e test pos\u cmd\u 1-d 如何使第一个-d由argparse解析,位置命令之后的任何内容都由该命令本身解析(基本上将pos_cmd_1-d作为单个参数读取) 因此,参数列表将是 pythonfile.py -d目录 -e试验 位置命令1-d-s-etc 因此,位置命令之前的任何内容都是可选的。位置命令之后的任何内容都将是位置命令本身的一部分 编辑:当尝试使用双破折号运行命令

如何让argparse只解析位置参数后面的命令

如果我有命令
pythonfile.py-d dir-e test pos\u cmd\u 1-d

如何使第一个
-d
由argparse解析,位置命令之后的任何内容都由该命令本身解析(基本上将
pos_cmd_1-d
作为单个参数读取)

因此,参数列表将是

  • pythonfile.py
  • -d目录
  • -e试验
  • 位置命令1-d-s-etc
因此,位置命令之前的任何内容都是可选的。位置命令之后的任何内容都将是位置命令本身的一部分

编辑:当尝试使用双破折号运行命令时,它告诉我后面的参数无法识别

pythonfile.py -d testdir -e test -- command -d -s

它说
-d-s
是无法识别的参数,而不是将它们与命令捆绑在一起。

只需将命令行稍微更改为

pythonfile.py -d dir -e test -- pos_cmd_1 -d
通过添加
--
,您可以告诉argparse停止寻找选项。因此,所有剩余的参数都在位置参数列表中设置

另一种方法是引用其余的论点:

pythonfile.py -d dir -e test "pos_cmd_1 -d"
并且(因为它只创建一个位置参数)在拆分的字符串上再次使用参数解析器(如果要在这些参数中传递带引号的字符串,则不理想)

这些方法的优点是它们本机受到
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']
使用简单的解析器:

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',并出现错误
parse\u known\u args
没有帮助

如果字符串不是'-d'和'-e'
parse_known_args
works:

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的位置符号似乎有效:

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'])
余数
的工作原理应该与'--'非常相似,捕获输入以供另一个解析器或命令使用

如果希望捕获整个命令行,则可能会出现问题,如:

In [12]: p.parse_args('-s pos_cmd_1 -d'.split())
usage: ipython3 [-h] [-d D] [-e E] ...
ipython3: error: unrecognized arguments: -s

用双破折号结束开关怎么样
pythonfile.py-d dir-e test--pos_cmd_1-d
至少很清楚选项停止的位置您可以给出一些上下文:您认为您为什么要这样做?@jornsharpe为docker compose编写一个包装器,允许我添加自定义扩展性,并且一些参数标志与docker命令的标志重叠。因此,如果
-d
位于compose命令(up/start/kill/etc)之前,那么它将被解析为my命令,但如果它位于compose命令之后,则它将是docker命令的一部分。因此,
python.py-d test up-d
第二个
-d
将由docker解析。在这种情况下,使用
--
,它经常出现在“…然后将这些参数传递给调用的任何对象”。在我看来,应该从shell中正确调用该实用程序(即,根据其记录的用法)。使用引号或双破折号表示该姿势。这些都是应该遵守的众所周知的标准。示例:
pythonfile.py-d dir-e test“pos\u cmd\u 1-d”
这两个选项都可以工作,但是没有一个选项允许我在用户不必自己输入--?准备字符串以获取位置命令后的所有内容的唯一选项是什么?位置命令可能有很多东西,所以我只需要通过比较arg列表中的每一项和可能的命令,将它和它后面的所有内容放入自己的字符串中就可以了吗?