Python 如何使用argparse读取命令行的剩余部分?

Python 如何使用argparse读取命令行的剩余部分?,python,command-line-arguments,argparse,Python,Command Line Arguments,Argparse,首先,我为这个糟糕的标题感到抱歉。事实上,我不能正确地表达总结大概是我目前80%的问题 我正在编写一个命令行程序来包装其他命令行程序,如下所示: my_wrapper.py --some options -for --the wrapper original_program --and its -options $ ./prog.py -- somecommand --somearg --someotherarg Namespace(commands=['somecommand', '--so

首先,我为这个糟糕的标题感到抱歉。事实上,我不能正确地表达总结大概是我目前80%的问题

我正在编写一个命令行程序来包装其他命令行程序,如下所示:

my_wrapper.py --some options -for --the wrapper original_program --and its -options
$ ./prog.py -- somecommand --somearg --someotherarg
Namespace(commands=['somecommand', '--somearg', '--someotherarg'])
在某些情况下,此命令将替换对原始程序的调用:

original_program --and its -options
我想提取包装器所需的选项,但保持原始程序名和参数不变,顺序完全相同。我不能对包装程序的参数做任何假设

使用argparse是否可以做到这一点?怎么做

我认为使用(已弃用的)
optparse
模块,只需从行中读取
args
即可

 (options, args) = parser.parse_args()
对于好奇的人来说,包装器的目标是帮助用户在HPC集群上提交作业。它的职责是处理编写定制脚本、启动脚本和检索结果的所有特殊需求

您可以使用
--
作为分隔符。简单的例子:

import argparse


parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('commands', type=str, nargs='+')
print(parser.parse_args())
然后像这样打电话:

my_wrapper.py --some options -for --the wrapper original_program --and its -options
$ ./prog.py -- somecommand --somearg --someotherarg
Namespace(commands=['somecommand', '--somearg', '--someotherarg'])
从bash手册:

--
表示选项结束,并禁用进一步的选项处理。
--
后面的任何参数都被视为文件名和参数。 -的参数相当于
--

其他选项正在使用 例如:

import argparse


parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('command', type=str)
parser.add_argument('-s', '--somearg', type=str)
args, unknown = parser.parse_known_args()
print(args)
print(unknown)
并运行:

$ ./prog2.py --somearg option test --other
Namespace(command='test', somearg='option')
['--other']

$ ./prog2.py  --somearg option test --other --second
Namespace(command='test', somearg='option')
['--other', '--second']

正如@hpaulj所说,您可以使用
nargs=argparse.rements
。文档中的示例:

>>> 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')

+1用于
parse\u known\u args
,这是
argparse
的真正工作
parse_args
只是一个包装器,它调用
parse_known_args
并引发异常,除非返回值的第二个元素为空。
nargs=argparse.rements
是另一个工具。谢谢@hpaulj这正是我想要的。几年后你来营救的。可能是