如何将python argparse与sys.argv以外的args一起使用



是否有一种方法可以使用argparse与任何字符串列表,而不是仅与sys.argv ?

这是我的问题:我有一个程序看起来像这样:

# This file is program1.py
import argparse
def main(argv):
    parser = argparse.ArgumentParser()
    # Do some argument parsing
if __name__ == '__main__':
    main(sys.argv)

当这个程序直接从命令行调用时,它工作得很好。但是,我有另一个python脚本,该脚本使用不同的命令行参数运行该脚本的批处理版本,我使用如下:

import program1
arguments = ['arg1', 'arg2', 'arg3']
program1.main(arguments)

我仍然希望能够解析参数,但argparse自动默认使用sys.argv而不是我给它的参数。是否有一种方法来传递参数列表而不是使用sys.argv ?

您可以将字符串列表传递给parse_args:

parser.parse_args(['--foo', 'FOO'])

只需将脚本更改为默认的sys.argv[1:]并解析参数,省略第一个(这是被调用的命令的名称)

import argparse,sys
def main(argv=sys.argv[1:]):
    parser = argparse.ArgumentParser()
    parser.add_argument("--level", type=int)
    args = parser.parse_args(argv)
if __name__ == '__main__':
    main()

或者,如果不能省略第一个参数:

import argparse,sys
def main(args=None):
    # if None passed, uses sys.argv[1:], else use custom args
    parser = argparse.ArgumentParser()
    parser.add_argument("--level", type=int)
    args = parser.parse_args(args)
    # Do some argument parsing
if __name__ == '__main__':
    main()

最后一个:如果你不能改变被调用的程序,你仍然可以做一些事情

让我们假设您不能更改的程序名为argtest.py(我添加了一个调用来打印参数)

然后更改argtest.sys模块的本地argv值:

import argtest
argtest.sys.argv=["dummy","foo","bar"]
argtest.main()
输出:

['dummy', 'foo', 'bar']    

Python argparse现在为add_argument (https://docs.python/3/library/argparse.html)提供了一个参数nargs

它允许我们为一个命名形参(这里是alist)提供任意多的实参

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--alist", nargs="*")
args = parser.parse_args()
print(args.alist)

所有在--alist之后的命令行值都被添加到列表中。

的例子:

$ python3 argparse-01.py --alist fred barney pebbles "bamm bamm"
['fred', 'barney', 'pebbles', 'bamm bamm']

如您所见,允许引用参数,但除非需要保护空格,否则不需要。

最新更新