Python 使用余数时进行argparse

Python 使用余数时进行argparse,python,Python,我创建以下参数解析器: parser = argparse.ArgumentParser() parser.add_argument('name') parser.add_argument('script') parser.add_argument('--src', nargs='?') 当运行/script.py\u名称\u脚本--src my\u script.py时,所有参数的值都是“按预期”的 现在,我添加一个余数: parser = argparse.ArgumentParser()

我创建以下参数解析器:

parser = argparse.ArgumentParser()
parser.add_argument('name')
parser.add_argument('script')
parser.add_argument('--src', nargs='?')
当运行
/script.py\u名称\u脚本--src my\u script.py
时,所有参数的值都是“按预期”的

现在,我添加一个余数:

parser = argparse.ArgumentParser()
parser.add_argument('name')
parser.add_argument('script')
parser.add_argument('--src', nargs='?')
parser.add_argument('args', nargs=argparse.REMAINDER)
现在,再次运行\u名称\u脚本--src my\u script.py,参数
src
突然变为
None

但是,运行
/script.py--src my_script.py_名称_脚本--arg1 arg2 xyz
将设置所有参数“如预期的那样”

如何实现参数解析器首先希望看到位置参数
name
script
,然后是一些已知参数,如
--src
,最后是任意余数

parser.add_argument('args', nargs='+')
但是您必须始终提供至少一个
args
参数

print parser.parse_args('--src 12 1 2 3 4'.split())
print parser.parse_args('1 2 --src 12 3 4'.split())
输出:

Namespace(args=['3', '4'], name='1', script='2', src='12')
Namespace(args=['3', '4'], name='1', script='2', src='12')
Namespace(args=['3', '4'], name='1', script='2', src='12')
usage: argp.py [-h] [--src SRC] name script [args [args ...]]
argp.py: error: unrecognized arguments: 3 4
不适用于
nargs='*'
,唉:

parser.add_argument('args', nargs='*')

print parser.parse_args('--src 12 1 2 3 4'.split())
print parser.parse_args('1 2 --src 12 3 4'.split())
输出:

Namespace(args=['3', '4'], name='1', script='2', src='12')
Namespace(args=['3', '4'], name='1', script='2', src='12')
Namespace(args=['3', '4'], name='1', script='2', src='12')
usage: argp.py [-h] [--src SRC] name script [args [args ...]]
argp.py: error: unrecognized arguments: 3 4
也就是说,
--src 12 1 2 3 4
起作用,但
12--src 12 3 4
不起作用

但是您必须始终提供至少一个
args
参数

print parser.parse_args('--src 12 1 2 3 4'.split())
print parser.parse_args('1 2 --src 12 3 4'.split())
输出:

Namespace(args=['3', '4'], name='1', script='2', src='12')
Namespace(args=['3', '4'], name='1', script='2', src='12')
Namespace(args=['3', '4'], name='1', script='2', src='12')
usage: argp.py [-h] [--src SRC] name script [args [args ...]]
argp.py: error: unrecognized arguments: 3 4
不适用于
nargs='*'
,唉:

parser.add_argument('args', nargs='*')

print parser.parse_args('--src 12 1 2 3 4'.split())
print parser.parse_args('1 2 --src 12 3 4'.split())
输出:

Namespace(args=['3', '4'], name='1', script='2', src='12')
Namespace(args=['3', '4'], name='1', script='2', src='12')
Namespace(args=['3', '4'], name='1', script='2', src='12')
usage: argp.py [-h] [--src SRC] name script [args [args ...]]
argp.py: error: unrecognized arguments: 3 4

也就是说,
--src 12 1 2 3 4
起作用,但
12--src 12 3 4
不起作用。

看起来您的问题与本章末尾使用的示例非常相似

似乎问题的答案是将
--src
作为第一个参数,放在位置参数之前

我做了以下工作,似乎奏效了:

parser = argparse.ArgumentParser()
parser.add_argument('--src')
parser.add_argument('name')
parser.add_argument('script')
parser.add_argument('args', nargs=argparse.REMAINDER)
当我像使用
/script.py--src=my_script.py那样运行上述脚本时,_名称\u script 1 2 3
的结果与预期的一样:

name = the_name
script = the_script
src = my_script.py
args = ['1', '2', '3']
如果删除--src like
/script.py,则脚本1 2 3的\u名称
结果是:

name = the_name
script = the_script
src = None
args = ['1', '2', '3']`
name = the_name
script = the_script
src = my_script.py
args = []`
当然,我可以保留
--src
并省略
1 2 3
参数,因此如果我运行
/script.py--src=my_script.py\u name\u script
,结果是:

name = the_name
script = the_script
src = None
args = ['1', '2', '3']`
name = the_name
script = the_script
src = my_script.py
args = []`

这看起来就像你所期望的。

看起来你的问题与本章结尾的示例非常相似

似乎问题的答案是将
--src
作为第一个参数,放在位置参数之前

我做了以下工作,似乎奏效了:

parser = argparse.ArgumentParser()
parser.add_argument('--src')
parser.add_argument('name')
parser.add_argument('script')
parser.add_argument('args', nargs=argparse.REMAINDER)
当我像使用
/script.py--src=my_script.py那样运行上述脚本时,_名称\u script 1 2 3
的结果与预期的一样:

name = the_name
script = the_script
src = my_script.py
args = ['1', '2', '3']
如果删除--src like
/script.py,则脚本1 2 3的\u名称
结果是:

name = the_name
script = the_script
src = None
args = ['1', '2', '3']`
name = the_name
script = the_script
src = my_script.py
args = []`
当然,我可以保留
--src
并省略
1 2 3
参数,因此如果我运行
/script.py--src=my_script.py\u name\u script
,结果是:

name = the_name
script = the_script
src = None
args = ['1', '2', '3']`
name = the_name
script = the_script
src = my_script.py
args = []`

这看起来就像你所期待的。

试过了。没有帮助
src
仍然是
None
。更新了答案。尝试了。没有帮助
src
仍然是
None
。更新了答案。我无法将其转换为位置参数,因为它是可选的。@Michael我更新了我的答案,请现在检查它是否满足您的需要。我无法将其转换为位置参数,因为它是可选的。@Michael我更新了我的答案,现在请检查它是否满足您的需要。可能的副本可能的副本