【问题标题】:Python argparse with -- as the valuePython argparse 与 -- 作为值
【发布时间】:2016-11-18 20:18:32
【问题描述】:

有没有办法使用 argparse 将 -- 作为值传递给 Python 程序而不使用等号 (=)?

我添加到 argparser 的命令行参数定义如下:

parser.add_argument('--myarg', help="my arg description")

你会在这样的程序中使用这个参数:

python myprogram.py --myarg value123

有没有办法用 -- 作为值而不是 'value123' 来运行这个程序?

python myprogram.py --myarg --

【问题讨论】:

  • 如果动作是store_true,则选项不带任何参数。
  • 即使使用等号,--myarg=-- 似乎也被视为与 --myarg -- 相同。
  • 它产生Namespace(myarg=[])。这使解析器感到困惑。坚持使用-- 作为分隔符,不要试图混淆argparse 或您的用户。为什么需要将此字符串视为参数?
  • --myarg=-- 工作正常。然而,在我的用例中,Java 命令调度程序启动了一个 python 命令行子进程,在参数/值对之间使用空格而不是等号。我不打算将 -- 作为参数,而是作为 --myarg 的值。这是特定用例的要求。
  • 与“--”相关的错误/问题:bugs.python.org/issue13922bugs.python.org/issue14364

标签: python argparse


【解决方案1】:

我怀疑不可能让argparse 原生地做到这一点。不过,您可以预处理sys.argv,作为一种非侵入性的解决方法。

import sys
from argparse import ArgumentParser
from uuid import uuid4

sentinel = uuid4().hex

def preprocess(argv):
    return [sentinel if arg == '--' else arg for arg in argv[1:]]

def postprocess(arg):
    return '--' if arg == sentinel else arg

parser = ArgumentParser()
parser.add_argument('--myarg', help="my arg description", type=postprocess)
args = parser.parse_args(preprocess(sys.argv))

【讨论】:

  • 我从你的代码中得到Namespace(myarg=[]) - 有或没有=。
  • 这就是重点。没有办法得到myarg=[],除非传入--。从 python 方面,你可以用myarg 做你现在想要的...
  • myarg=[] 是我对 nargs='*' 操作的期望,而不是默认的 nargs。
  • 这真的很有帮助,也是一个很好的起点,非常感谢。但是,正如@hpaulj 指出的那样,我需要解析的值等于字符串'--' 而不是空列表[]。
  • 对,我的目标是让--myarg=-- 的行为与--myarg -- 相同,而不仅仅是失败。如果您想支持nargs='*',则必须将+= '=--' 更改为其他内容(并可能对其进行后处理),但基本思想是相同的。
猜你喜欢
  • 2015-01-03
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 2021-06-24
  • 2020-02-12
  • 2019-05-27
相关资源
最近更新 更多