在多个模块中添加参数时,argparse.ArgumentParser ArgumentError

时间:2018-06-29 15:06:08

标签: python argparse

我正在研究自动测试框架(使用pytest)来测试应用程序的多种风格。测试框架应该能够解析常见的(针对所有风味)命令行args和特定于风味的args。 代码如下:

parent.py:

T

MainScript.py:

Comparable

Test_Cases.py

import argparse
ARGS = None
PARSER = argparse.ArgumentParser()
PARSER.add_argument('--arg1', default='arg1', type=str, help='test arg1')
PARSER.add_argument('--arg2', default='arg2', type=str, help='test arg2')

def get_args():
    global ARGS
    if not ARGS:
        ARGS = PARSER.parse_args()
    return ARGS

执行MainScript.py失败,并出现以下错误:

E ArgumentError:参数--arg3:冲突的选项字符串:--arg3

1 个答案:

答案 0 :(得分:1)

所以问题是您已经声明

PARSER.add_argument('--arg3', default='arg3', type=str)

MainScript.py内部的全局范围内。这意味着该代码行将在每次导入时都像在Test_Cases.py中那样执行,因此为什么会出现冲突错误,所以您将arg 3两次添加到argparse中。

最简单的解决方案是将PARSER.add_argument('--arg3', default='arg3', type=str)移到您的main()函数中,因为该函数只会被调用一次。

def main():
    PARSER.add_argument('--arg3', default='arg3', type=str)
    pytest.main(['./Test_Cases.py', '-v'])

但是这样做会导致另一个问题,这源于您对get_args()的多重定义。当您在get_args()之前调用main()时,它仅包含parent.py中的两个已定义参数,因此缺少arg3。如果您将通话移至main()或至少在main()被呼叫后才可以使用。

我个人只是从get_args()中删除了MainScript.py的定义和调用,效果很好。