问题 如何使用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?


5859
2017-08-09 14:38


起源

你确定你“已经遍布文档”吗? - Arnial
becouse  的allmost  所有  例子  做  不  使用  sys.argv中 - Arnial
啊,现在我明白了...我正在看argparse教程(仅使用 parse_args() 没有参数)而不是你发布的实际文档。 - Adrian Padin
也可以修改 sys.argv 本身(虽然这将影响其他用户 sys.argv)。 unittest文件, test_argparse.py 两种方式测试案例。 - hpaulj
找到这样的答案的另一种方法是查看代码。所有的 argparse 是写的 python。它不是编译的黑盒子。 - hpaulj


答案:


您可以传递字符串列表 parse_args

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

8
2017-08-09 14:42



谢谢,我显然正在查看argparse的教程,并错过了显示此内容的实际文档。 - Adrian Padin


只需将脚本更改为默认值即可 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 (我添加了一个打印参数的调用)

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

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

输出:

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

4
2017-08-09 14:41



参数是以编程方式生成的,因此我无法以任何方式使用sys.argv。 - Adrian Padin
您的代码缺少最关键的部分: args = parser.parse_args(args) - Alastair McCormack
好的,即使它不是这里的重点,添加它。关键是:如何更改默认参数并传递自定义参数。我还添加了一种管理方式,而根本不需要更改被调用的程序。 - Jean-François Fabre
+1因为即使它比我需要的信息多一点,第一部分(sys.argv[1:])从接受的答案中遗漏了。 - Adrian Padin
谢谢,我认为这是一个有用的微妙之处 - Jean-François Fabre