如何创建一个adb shell就像python中的参数解析器一样?

时间:2013-11-26 12:13:49

标签: python parsing command-line-arguments argparse

adb shell am command (activity manager)的参数如下:

 [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]

据我所知argparse是解析参数的python方法。我需要一个应该采取的行动:

  • 由2个或更多参数组成(例如--eia key1 1 2 3)(参见最后一点)
  • 可选
  • 编辑 它可以多次出现,例如。 --eia key1 1,2 --eia key2 2,1有效
  • 第一个参数的类型可能与其余参数的类型不同
  • 这样的其他可选参数可以存在
  • 该示例具有,的分隔符,但我想允许使用空格分隔,因为我的实际参数值可能是字符串,我想将它们解析为shell(如果是字符串)应以-开头,引号有助于:"-asdf"

另一个问题has an answer可以通过位置参数来做到这一点:

parser = argparse.ArgumentParser(usage='%(prog)s [-h] file file [file ...]')
parser.add_argument('file1', nargs=1, metavar='file')
parser.add_argument('file2', nargs='+', metavar='file', help=argparse.SUPPRESS)
namespace = parser.parse_args()
namespace.file = namespace.file1 + namespace.file2

但我不知道这些是否适用于可选参数?

根据我的要求,从argparse开始是个好主意吗?还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

- consists of 2 or more arguments (eg. --eia key1 1 2 3) (see last point)

有一个建议的补丁允许nargs2 or more一样,以re {n,m}符号为模型。但是现在我觉得nargs='+'是你最好的选择。重要的是它抓住了必要的论据。您可以在parse_args之后检查“2个或更多”(自定义type也可以检查)。

- is optional

使用--eia标志来处理

- edit it can occour multiple times, eg. --eia key1 1,2 --eia key2 2,1 is valid

允许使用--eia标志,但仅保留最后一个条目。但action='append'会将每个条目集保存为列表(或元组?);所以命名空间将有args.eia = [['key1','1','2'],['key2',...],...]。与动作类型一起玩并验证这一点。

- the type of the first argument may differ from the type of the rest

将值保留为字符串,然后进行自己的转换是最简单的。您可以编写自定义type(或action)来检查值。但代码与您在argparse之后使用的代码类似。

- other optional arguments like this can exist

这取决于你如何编写添加的代码。

- the example has the delimiter of a , but I'd like to allow delimiting with spaces, because my actual argument values may be strings and I'd like to leave parsing them to the shell (if a string should start with -, quotation marks help: "-asdf")

主shell,即调用脚本的shell,是将命令行拆分为字符串的主shell,主要是在空格上。 argparse使用sys.argv,即字符串列表。如果该列表不是您想要的,那么在将其传递给argparse.parse_args(argv)之前,您必须先将其弄清楚。

测试argparse的常用方法是:

parser.parse_args('--eia key1 1,2 --eia key2 2,1'.split())

复制主要分裂空格,但不处理shell引用和转义字符。有一种方法可以复制shell动作,但是我必须四处寻找它。