argparse.ArgumentParser ArgumentError при добавлении аргументов в несколько модулей - PullRequest
0 голосов
/ 29 июня 2018

Я работаю над автоматизированной средой тестирования (используя pytest), чтобы протестировать несколько вариантов приложения. Тестовая среда должна иметь возможность анализировать общие (для всех разновидностей) аргументы командной строки и аргументы, специфичные для разновидности. Вот как выглядит код:

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

Сбой при выполнении MainScript.py со следующей ошибкой:

E ArgumentError: аргумент --arg3: конфликтующие строки параметров: --arg3

1 Ответ

0 голосов
/ 29 июня 2018

Итак, проблема в том, что вы объявили

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, и он работал просто отлично.

...