Python argparse:如何处理MacOSX`-psn`参数

时间:2013-10-29 14:40:09

标签: python macos argparse launchd

MacOSX launchd将-psn...参数传递给应用程序。如何判断argparse如何解析参数?它基本上是-psn_([0-9]+)_([0-9]+)但如果它只是解析-psn(\S*)我就没事了。这有可能吗?

(有关流程序列号(PSN)的一些文档,请参阅herehere是关于如何处理参数的问题。)

2 个答案:

答案 0 :(得分:2)

我不知道你需要什么其他参数(我使用Linux),但是这个(来自交互式Ipython会话):

In [3]: parser.add_argument('-p')
Out[3]: _StoreAction(option_strings=['-p'], dest='p', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)

In [4]: parser.parse_args('-psn_123_455'.split())
Out[4]: Namespace(p='sn_123_455')

然后您可以根据需要解析args.p

您不能使用parser.add_argument('-psn'),因为只有单个字母选项可以包含连续的参数。 ('-psn _123_455',' - psn = _123_455'工作,但不是'-psn_123_455')。

如果-p标志还有其他用途,则无效。


您可以使用自定义type来解析参数,例如

def psntype(x):
    ret = re.match('sn_([0-9]+)_([0-9]+)',x)
    if ret is None:
        raise ValueError('bad -psn argument')
    return ret.groups()

parser=argparse.ArgumentParser()
parser.add_argument('-p',type=psntype)
print parser.parse_args('-psn_123_455'.split())
# Namespace(p=('123', '455'))
parser.parse_args('-psn_12355'.split())
# usage: ipython [-h] [-p P]
# error: argument -p: invalid psntype value: 'sn_12355'

使用type进行解析的主要优点是argparse可以引发信息错误(使用时)。但是您自己的post-argparse代码可能会引发相同的错误(parser.error('bad -psn argument')

答案 1 :(得分:1)

查看 psn 参数的结构,不可能在不干扰可能的“-p”参数的情况下使用argparse解析它(请参阅@ hpaulj的答案)。因此,我建议使用partial parsing,并从余数列表中提取它。