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

时间:2014-09-16 09:09:19

标签: python command-line-arguments argparse

首先,我很抱歉这个糟糕的头衔。我无法正确制定摘要的事实可能是我当前问题的80%。

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

my_wrapper.py --some options -for --the wrapper original_program --and its -options

此命令在某些情况下会替换对原始程序的调用:

original_program --and its -options

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

用argparse可以做到吗?怎么样?

我认为使用(已弃用的)optparse模块就像从行中读取args一样简单

 (options, args) = parser.parse_args()

对于好奇的人来说,包装器的目标是帮助用户在HPC群集上提交作业。它的职责是照顾我们编写自定义脚本,启动它和检索结果的所有特殊要求。

1 个答案:

答案 0 :(得分:6)

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

import argparse


parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('commands', type=str, nargs='+')
print(parser.parse_args())

然后这样打电话:

$ ./prog.py -- somecommand --somearg --someotherarg
Namespace(commands=['somecommand', '--somearg', '--someotherarg'])

来自bash手册:

  

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

其他选项正在使用parse_known_args 示例:

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.REMAINDER。来自docs的示例:

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