[英]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
或其他无法处理引号的操作系统/外壳?
您询问了一个稍微不同的命令行:
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.