Python argparse以不同的方式处理参数
我想创建一个可选参数,它将是Python argparse以不同的方式处理参数,python,arguments,command-line-arguments,argument-passing,Python,Arguments,Command Line Arguments,Argument Passing,我想创建一个可选参数,它将是'-'(双破折号和空格),并将其后面的所有内容作为其值。问题是在'-'之后可能会出现一些其他可选参数。我不希望将它们解析为可选参数,而是解析为'-'的值。例如: python prog1 --foo 1 --bar 2 这里的foo和bar是可选参数,其值分别为1和2 python prog1 --foo 1 --bar 2 -- --foo 4 --bar 14 在这里,我希望将foo和bar前面的-->解析为可选参数。但是我希望将'--foo4--bar 14
'-'
(双破折号和空格),并将其后面的所有内容作为其值。问题是在'-'
之后可能会出现一些其他可选参数。我不希望将它们解析为可选参数,而是解析为'-'
的值。例如:
python prog1 --foo 1 --bar 2
这里的foo
和bar
是可选参数,其值分别为1
和2
python prog1 --foo 1 --bar 2 -- --foo 4 --bar 14
在这里,我希望将foo
和bar
前面的-->
解析为可选参数。但是我希望将'--foo4--bar 14'
解析为可选参数'--'
的值。如果可能的话,我不想将'-'
后面的参数重命名为foo2
和bar2
那么这可能吗?这是如何实现的呢?看起来图书馆可以为您做到这一点
本节:
“[--]”。按照惯例,双破折号“-”用于分隔位置
可能被误认为选项的参数。为了支持这一点,
约定将“[--]”添加到您的使用模式中
argparse
已经支持将--
作为选项结束符。唯一的区别是默认处理分别处理以下参数。假设prog1
看起来像
import argparse
p = argparse.ArgumentParser()
p.add_argument('--foo')
p.add_argument('--bar')
p.add_argument('remaining', nargs=argparse.REMAINDER)
print p.parse_args()
然后命令
% python prog1 --foo 1 --bar 2 -- --foo 4 --bar 14
产生
Namespace(bar='2', foo='1', remaining=['--', '--foo', '4', '--bar', '14'])
(而不是名称空间(…,剩余='--foo 4--bar 14')
)。如有必要,可通过快速后处理步骤修复:
args = p.parse_args()
args.remaining = " ".join(args.remaining)
print args
那么结果是
Namespace(bar='2', foo='1', remaining='-- --foo 4 --bar 14')
丢弃--
参数需要一些额外的后处理:
args = p.parse_args()
if args.remaining[0] == "--":
args = args[1:]
你为什么要这样做?这是一个完全的反模式,很可能会让人感到困惑(/你未来的自我)。@will--这不是一个完全的反模式。这实际上是一种比较常见的方法来指定将传递给从属程序的参数(可能通过
subprocess.Popen
)。@mgilson所以我刚刚读到了这篇文章。这对我来说是个新闻。事实上,argparse
已经支持使用--
来表示选项解析结束的常见约定。--
通常在类似Unix的操作系统上用于将参数与原始输入分开(原始输入通常表示要传递给其他命令的参数,如xargs
).See。这太棒了——但是,我似乎在文档中找不到它。我能找到的最接近的是argparse.rements
,但它似乎没有使用--
分隔符…请参见(链接到文档的Python 2.7版本)的结尾。谢谢你提醒我关于余数;这似乎是比*
更好的选择(至少更具描述性;我不知道在这种情况下是否有功能上的区别。)很好。好吧,反正你有我的+1,我学到了一些新东西。我运行了这段代码,我的余数是余数=['--','--foo',4','--bar',14']
。请注意,--
显示在其余部分中。