繁体   English   中英

配置argparse以接受带引号的参数

[英]Configure argparse to accept quoted arguments

我正在编写一个程序,除其他外,该程序允许用户通过参数指定要加载的模块(然后用于执行操作)。 我正在尝试建立一种将参数轻松传递到此内部模块的方法,并且我试图使用ArgParse的action='append'使其建立一个参数列表,然后我将通过该列表。

这是我正在使用的参数的基本布局

parser.add_argument('-M', '--module',
                    help="Module to run on changed files - should be in format MODULE:CLASS\n\
                          Specified class must have function with the signature run(src, dest)\
                          and return 0 upon success",
                    required=True)
parser.add_argument('-A', '--module_args',
                    help="Arg to be passed through to the specified module",
                    action='append',
                    default=[])

但是-如果我随后尝试使用python my_program -M module:class -A "-f filename" (我想将-f filename传递到我的模块)来运行该程序,则似乎正在将-f解析为它自己的参数(并且我得到错误my_program: error: argument -A/--module_args: expected one argument

有任何想法吗?

解决的办法是接受任意参数-有在argparse的文档的例子在这里

argparse.REMAINDER。 所有其余的命令行参数都收集到一个列表中。 这对于分派到其他命令行实用程序的命令行实用程序通常很有用:

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo')
>>> parser.add_argument('command')
>>> parser.add_argument('args', nargs=argparse.REMAINDER)
>>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split()))
Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B')

附:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-M', '--module',
                    help="Module to run on changed files - should be in format MODULE:CLASS\n\
                          Specified class must have function with the signature run(src, dest)\
                          and return 0 upon success",
                    )
parser.add_argument('-A', '--module_args',
                    help="Arg to be passed through to the specified module",
                    action='append',
                    default=[])
import sys
print(sys.argv)
print(parser.parse_args())

我得到:

1028:~/mypy$ python stack45146728.py -M module:class -A "-f filename"
['stack45146728.py', '-M', 'module:class', '-A', '-f filename']
Namespace(module='module:class', module_args=['-f filename'])

这使用的是Linux Shell。 sys.argv ,带引号的字符串仍然是一个字符串,并且可以正确地解释为-A的参数。

不带引号的-f是分开的,并被解释为标志。

1028:~/mypy$ python stack45146728.py -M module:class -A -f filename
['stack45146728.py', '-M', 'module:class', '-A', '-f', 'filename']
usage: stack45146728.py [-h] [-M MODULE] [-A MODULE_ARGS]
stack45146728.py: error: argument -A/--module_args: expected one argument

您是否正在使用windows或其他无法处理引号的操作系统/外壳?


Argparse中,“ append”未按预期工作

您询问了一个稍微不同的命令行:

1032:~/mypy$ python stack45146728.py  -A "-k filepath" -A "-t"
['stack45146728.py', '-A', '-k filepath', '-A', '-t']
usage: stack45146728.py [-h] [-M MODULE] [-A MODULE_ARGS]
stack45146728.py: error: argument -A/--module_args: expected one argument

如前所述, -k filepath作为一个字符串传递。 由于空间原因, argparse不会将其解释为标志。 但是它确实将裸露的“ -t”解释为标志。

有一个错误/问题涉及将未定义的“ -xxx”字符串解释为参数而不是标志的可能性。 我必须查一下,看看是否有任何东西可以投入生产。

可以在argparse.ArgumentParser._parse_optional方法中找到有关如何将字符串分类为标志或参数的详细信息。 它包含一个注释:

  # if it contains a space, it was meant to be a positional if ' ' in arg_string: return None 

http://bugs.python.org/issue9334 argparse does not accept options taking arguments beginning with dash (regression from optparse)作为argparse does not accept options taking arguments beginning with dash (regression from optparse)是该主题上的一个古老而又漫长的错误/问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM