如何在argparse期间获取/记录arg列表中选项的索引

时间:2014-01-28 00:10:49

标签: python argparse

我想在解析选项时将索引记录到sys.argv列表中

我试图用python脚本包装另一个程序。 在包装器脚本中,我试图解析与脚本无关的选项 并从argv列表中删除它们,以便我可以将其余参数传递给被包装的程序。

为此,我使用parser.parse_known_args(),这样我就不必跟踪程序可能支持的每个参数。只是与包装器有关的那些。

现在,如果解析记录了需要删除的参数索引 我可以在解析后删除它们并将剩余的args传递给包装程序。

如何在解析过程中记录此信息?

并非所有对包装器有意义的参数都应该被删除。所以我需要有选择性

2 个答案:

答案 0 :(得分:1)

我不熟悉parser.parse_known_args()。我使用的是Python 2.7,没有这样的功能。你可以做的是将原始的sys.argv保存在例如arg_list中并执行

indices = [arg_list.index(a)for a selected_arguments]

这将返回所选参数的索引列表(位置)

答案 1 :(得分:1)

parse.parse_known_args返回2个值,包含它所知道的namespace参数,以及它无法处理的字符串列表。我认为rest列表是您想要传递给其他程序的。

换句话说:

[args1, rest] = parser1.parse_known_args() # or (sys.argv[1:])
args = parser2.parse_args(rest)

如果你不能给parser2一个明确的参数列表(例如它被编码为parse_args()),那么你需要这样做:

sys.argv[1:] = rest

我再次看了argparse_parse_known_args的内部。它遍历参数字符串几次。使用字符串的循环使用while start_index<max_index:start_index根据每个参数的nargs的不同而增加。实际上,它确实指向用于特定参数的第一个字符串(例如-f标志)。但它的值不会给action函数(您可以自定义)。也没有记录在任何地方。无法处理的字符串将添加到extras列表中。这是parse_known_args返回的第二个值。