繁体   English   中英

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

[英]How to use python argparse with args other than sys.argv?

我已经浏览了所有文档,似乎没有办法做到这一点,但是:

有没有办法将 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()
    # Do some argument parsing
    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 现在有一个参数nargs用于add_argument ( https://docs.python/3/library/argparse.html )。

它允许我们为命名参数拥有任意数量的参数(这里是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']

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM