2013-10-29 51 views
2

MacOSX launchd将-psn...参数传递给应用程序。我怎样才能告诉​​如何解析参数?它基本上是-psn_([0-9]+)_([0-9]+),但我很好,如果它只是分析-psn(\S*)。这可能吗?Python argparse:如何处理MacOSX' -psn`参数

(约进程序列号(PSN)的一些文档资料请参阅here,而且here是我关于如何处理参数做题。)

+0

由于它已被弃用,根据文件,一个干净的方式来处理它将忽略它,恕我直言。你需要处理关于PSN ,准确地说? – Sven

+0

@Sven:最小的处理方式是告诉'argparse'忽略它,但我甚至不知道该怎么做(我不确定这是否可能)。步骤是告诉'argparse'获取'-psn_'后面的部分作为此参数的参数。然后,关于如何处理它的问题是[另一个](http://stackoverflow.com/questions/19661637/psn-parameter-by-macosx-launchd-what-c​​an-i-do-it-it) – Albert

+0

现在我明白了 – Sven

回答

1

望着PSN论点的结构,它不是可以用argparse解析它,而不会干扰可能的“-p”参数(请参阅@ hpaulj的答案)。所以,我建议使用partial parsing,并从剩余列表中提取它。

+0

所以,你基本上说'argparse'不能解析它吗?现在,我正在剥去advan中的参数因为我想在没有参数的情况下使用普通的'argparse'行为。 – Albert

+0

是的。它看起来像一个不能喂正则表达式或有些参数匹配,所以在解析之前或之后剥掉** psn **似乎是唯一可行的解​​决方案。 – Sven

+0

所以,回答我的原始问题:通过'argparse'不可能,我必须在别的地方处理它? – Albert

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代码可能会引发相同的错误(parser.error('bad -psn argument')

+0

嗯,当然你可以做到这一点,但这是一个黑客攻击,因为这个原因,我不想使用'-p'来做其他事情。 – Albert

+0

如果我定义一个可以解析参数的'type',那么它是否更简单? – hpaulj

+1

我不知道Mac的传统,但在Unix中,同时拥有“-p”选项(例如打印标志)和“-psn ”选项会令人困惑。通常它会被解析为'['-p',' - s',' - n',]',其中'p'和's'是不带参数的标志,'n'需要一个论据。 – hpaulj