首先,我为这个糟糕的标题感到抱歉。我无法正确制定摘要这一事实可能是我当前问题的 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 集群上提交作业。它的职责是处理我们编写自定义脚本、启动脚本和检索结果的所有特殊要求。
最佳答案
您可以使用 --
作为分隔符。简单示例:
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 手册:
A
--
signals the end of options and disables further option processing. Any arguments after the--
are treated as filenames and arguments. An argument of - is equivalent to--
.
其他选项正在使用 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
。来自文档的示例:
>>> 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')
关于python - 如何使用 argparse 读取命令行的剩余部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25864774/