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

Cly*_*ost 16 python argv argparse

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

有没有办法将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)
Run Code Online (Sandbox Code Playgroud)

从命令行直接调用此程序时,此方法正常.但是,我有另一个python脚本,它使用不同的命令行参数运行此脚本的批处理版本,我正在使用这样:

import program1

arguments = ['arg1', 'arg2', 'arg3']
program1.main(arguments)
Run Code Online (Sandbox Code Playgroud)

我仍然希望能够解析参数,但argparse自动默认使用sys.argv而不是我给它的参数.有没有办法传入参数列表而不是使用sys.argv?

iCa*_*art 13

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

parser.parse_args(['--foo', 'FOO'])
Run Code Online (Sandbox Code Playgroud)


Jea*_*bre 6

只需将脚本更改为默认值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()
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)

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

让我们假设您无法更改的程序被调用argtest.py(我添加了对print参数的调用)

然后只需更改模块的本地argvargtest.sys:

import argtest
argtest.sys.argv=["dummy","foo","bar"]
argtest.main()
Run Code Online (Sandbox Code Playgroud)

输出:

['dummy', 'foo', 'bar']    
Run Code Online (Sandbox Code Playgroud)