【问题标题】:Python argparse - using quotesPython argparse - 使用引号
【发布时间】:2017-08-11 00:27:36
【问题描述】:

我希望 "arg1" "arg2" 周围的 引号 被视为不在同一个列表中的单独参数,并且 "arg1 arg2" 作为单独的参数,但在同一个列表中。

test.py 取自here

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--nargs', nargs='*')

for _, value in parser.parse_args()._get_kwargs():
  if value is not None:
    print(value)

运行 1

python test.py --nargs "arg arg2"

输出 1

['arg arg2']

我想这很好吗?但是 arg 和 arg2 是否被视为单独的参数?

运行 2

python test.py --nargs "arg" "arg2"

输出 2

['arg', 'arg2']

在同一个列表中,但它们是否被视为单独的参数?我需要它们是这样的:

['arg'] ['arg2']

【问题讨论】:

  • 你的 shell 决定了参数的分离方式,而不是 python。大多数 shell 会将 "arg arg2" 视为单个参数,并将其传递给 python。如果您想将单词分成单独的参数,则必须以通常的方式进行(例如使用str.split())。
  • @Roelant 格式:'arg1' 'arg2' 应该是两个单独的 args 在两个单独的行中,而 'arg1 arg2' 应该是两个单独的 args 在同一行中。
  • @glibdud 感谢您的澄清。由于我想在空格上拆分 - str.split()) 就足够了。但是无法正确实施。

标签: python argparse


【解决方案1】:

python test.py --nargs "arg arg2" 给解析器(通过sys.argv[1:]['--nargs', 'arg arg2']。解析器将该参数字符串 'arg arg2' 放入 args 命名空间。因为nargs='*' 它被放在了一个列表中。

所以args = parser.parse_args() 应该产生

Namespace(nargs = ['arg arg2'])

python test.py --nargs "arg" "arg2" 的不同之处仅在于 shell 将两个字符串 ['--nargs', 'arg'. 'arg2'] 分开,而解析器将这两个字符串放入该列表中。

打印sys.argv 以查看解析器必须处理的内容通常会有所帮助。

要获得['arg'] ['arg2'],我想你必须使用

parser.add_argument('--nargs', nargs='*', action='append')

python test.py --nargs "arg" --nargs "arg2"

每个--nargs 出现都会创建一个其参数列表(因为*),并将其附加到命名空间属性。实际上它会产生一个列表列表:

[['arg'], ['arg2']]

【讨论】:

  • 谢谢。我不想要列表列表。似乎 str.split()) 就足够了。知道如何在 parser.add_argument('--nargs', nargs='*') 中实现它吗?
  • 我只会在解析后使用列表理解。
猜你喜欢
  • 2012-10-21
  • 2013-06-24
  • 2020-11-25
  • 2021-05-25
  • 2011-05-13
  • 2012-12-21
  • 2013-06-06
  • 2014-05-03
  • 2017-08-30
相关资源
最近更新 更多