【问题标题】:Python argparse: how to handle MacOSX `-psn` parameterPython argparse:如何处理 MacOSX `-psn` 参数
【发布时间】:2013-10-29 14:40:09
【问题描述】:

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

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

【问题讨论】:

  • 由于它已被弃用,根据文件,处理它的干净方法是忽略它,恕我直言。关于 PSN,您究竟需要处理什么?
  • @Sven:嗯,最低限度的处理是告诉argparse 以某种方式忽略它,但我什至不知道该怎么做(我不确定这是否可能)。下一步是告诉argparse 获取-psn_ 之后的部分作为此参数的参数。然后,关于如何处理它的问题是another one

标签: python macos argparse launchd


【解决方案1】:

我不知道您还需要什么其他参数(我使用 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 可以引发信息错误(使用)。但是您自己的 argparse 后代码可能会引发相同的错误 (parser.error('bad -psn argument').

【讨论】:

  • 嗯,你当然可以这样做,但这是一个 hack,因此我不喜欢不使用 -p 做其他事情。
  • 如果我定义一个可以解析参数的type 会不会更麻烦?
  • 我不了解 Mac 的传统,但在 Unix 中,同时具有 -p 选项(例如打印标志)和 -psn<arg> 选项会令人困惑。通常会被解析为['-p','-s','-n',<arg>],其中ps 是不带参数的标志,n 带参数。
【解决方案2】:

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

【讨论】:

  • 那么,您基本上是在说argparse 无法解析它?现在,我提前剥离了参数,因为我想要正常的argparse 行为,以防有未知参数。
  • 是的。似乎无法将正则表达式或类似的东西提供给 argparse 以进行参数匹配,因此在解析之前或之后剥离 psn 似乎是唯一可行的解​​决方案。
  • 所以,回答我原来的问题:通过argparse 是不可能的,我必须在其他地方处理它?
  • @hpaulj 的回答是恕我直言,这是通过 argparse 处理它的一种非常好的方法。但是,无论如何,与 PSN 没有任何关系......
  • 好吧,对我来说不是那么多,因为它使-p 无法用于其他目的,只是为了有这样一个骇人听闻的解决方案。无论如何,简单的答案似乎是通过argparse 是不可能的(你的回答有点错误:“解析会很烦人”
猜你喜欢
  • 2017-01-14
  • 1970-01-01
  • 2017-11-26
  • 2020-03-04
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2011-11-04
  • 2014-09-09
相关资源
最近更新 更多