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

标签 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 集群上提交作业。它的职责是处理我们编写自定义脚本、启动脚本和检索结果的所有特殊要求。

最佳答案

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

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/

相关文章:

python - 管理具有不同内存使用情况的 Python 多进程进程

Python:如何组合两个函数的返回值并使用线程将它们附加到列表中?

python - 使用 argparse 传递参数后如何将 python 脚本作为批处理作业运行?

python - argparse 可以将位置参数与命名参数相关联吗?

python - 在 python argparse 中使用 -h 时崩溃

python - numpy 记录数组与时间?

command-line - 从控制台加载参数

python - 在 jupyter/ipython notebook 中将命令行参数传递给 argv

java - jar是否区分程序参数和jvm参数

python - 同时使用 pytest 和 tf.test.TestCase 的问题