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

asc*_*bol 3 python command-line-arguments argparse

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

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

my_wrapper.py --some options -for --the wrapper original_program --and its -options
Run Code Online (Sandbox Code Playgroud)

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

original_program --and its -options
Run Code Online (Sandbox Code Playgroud)

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

用argparse可以做到吗?如何?

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

 (options, args) = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

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

Sla*_*kov 6

您可以使用--分隔符.简单的例子:

import argparse


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

然后像这样打电话:

$ ./prog.py -- somecommand --somearg --someotherarg
Namespace(commands=['somecommand', '--somearg', '--someotherarg'])
Run Code Online (Sandbox Code Playgroud)

从bash手册:

A -- 表示选项结束并禁用进一步的选项处理.之后的任何参数--都被视为文件名和参数.- 的论据等同于--.

其他选项是使用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)
Run Code Online (Sandbox Code Playgroud)

并运行:

$ ./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']
Run Code Online (Sandbox Code Playgroud)

正如@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')
Run Code Online (Sandbox Code Playgroud)

  • `nargs = argparse.REMAINDER`是另一个工具. (3认同)