Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

argparse.ArgumentParser ArgumentError when adding arguments in multiple modules

I am working on automated test framework (using pytest) to test multiple flavors of an application. The test framework should be able to parse common (to all flavors) command line args and args specific to a flavor. Here is how the code looks like:

parent.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:

import pytest
from parent import PARSER

ARGS = None
PARSER.conflict_handler = "resolve"
PARSER.add_argument('--arg3', default='arg3', type=str)


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

get_args()


def main():
    pytest.main(['./Test_Cases.py', '-v'])

if __name__ == "__main__":
    main()

Test_Cases.py

from MainScript import get_args

ARGS = get_args()


def test_case_one():
    pass

Executing MainScript.py fails with following error:

E ArgumentError: argument --arg3: conflicting option string(s): --arg3

like image 341
piyush Avatar asked Sep 02 '25 15:09

piyush


1 Answers

So the problem is that you have declared

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

in a global scope inside MainScript.py. That means that that line of code will be executed every time you import it like you do in Test_Cases.py hence why you get the conflict error, you're adding arg 3 to your argparse twice.

Easiest solution is to move PARSER.add_argument('--arg3', default='arg3', type=str) into your main() function as that will only get called once.

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

But doing that causes another problem stemming from your multiple definition of get_args(). When you call get_args() before your main() it only has the two defined arguments from parent.py so it's missing arg3. If you move the call down into your main() or at least after your main() gets called it will work.

Personally I just removed both the definition and the call of get_args() from MainScript.py and it worked just fine.

like image 54
MCBama Avatar answered Sep 05 '25 12:09

MCBama