【问题标题】:How to use python argparse with args other than sys.argv?python - 如何将python argparse与sys.argv以外的args一起使用?
【发布时间】:2016-12-15 16:20:49
【问题描述】:

我翻遍了整个文档,似乎没有办法做到这一点,但是:

有没有办法将 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?

【问题讨论】:

标签: python argparse argv


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    只需将脚本更改为默认为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']    
    

    【讨论】:

      【解决方案3】:

      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']
      

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

      【讨论】:

        猜你喜欢
        • 2020-11-05
        • 2012-01-15
        • 2016-05-23
        • 2015-03-11
        • 1970-01-01
        • 2013-02-13
        • 2011-06-09
        • 1970-01-01
        • 2016-08-18
        相关资源
        最近更新 更多