Использовать встроенный argparse в Python3 - PullRequest
0 голосов
/ 24 мая 2018

Я хочу создать модуль Python, который может использоваться как командной строкой, так и другими модулями.Например:

python3 Capacity.py arg1 arg2 arg3
or
>>> capacity.execByString("arg1 arg2 arg3")

Я создал класс для (с некоторыми исследованиями) получения результата argparse в коде:

class ArgumentParserError(Exception): pass

class Parseur(ArgumentParser):
    def error(self, msg):
        raise ArgumentParserError(msg)

    def analyze(self, args):

        if type(args) is not list:
            args = args.split() # To work with a String

        try:
            result = self.parse_args(args)
            return True, result
            # Returns True and the namespace if OK
        except ArgumentParserError as err:
            return False, err.args[0]
            # Returns False and the error message if not OK

Я использую его так:

class Capacity():
    def __init__(self):
        self.parser = Parseur()
        # Config the parser

    def execByArguments(*args):
        # Do the job

    def execByString(command):
        isOK, result = self.parser.analyze(command)
        if isOk:
            # Launch execByArguments with the rights args in result
        else:
            # Print error message
            print(result)

    def execFromCommandLine():
        args = self.parser.parse_args()
        # Launch execByArguments with the rights args

if __name__ == "__main__":
    execFromCommandLine()

Но есть 2 основные проблемы, и, конечно, некоторые из них я еще не обнаружил:

  • аргументы не анализируются правильно (например, удваивает кавычки), так как функция split имеет "пробелы"разделитель
  • с помощью флага -h в любом случае закройте программу

Я убежден, что создание этого другого класса Parseur бесполезно / не хорошо, и есть обходной путь.Запуск модуля через подпроцесс также не является хорошей идеей: я хочу получить возвращенный объект в этом случае.Можете ли вы помочь мне найти крутой способ сделать то, что я хочу, пожалуйста?Спасибо уже.

PS: Писать код в онлайн-формуляре - такая боль ^^.

1 Ответ

0 голосов
/ 24 мая 2018

Вы не далеко.Я бы сделал это как-то так:

class Capacity():
    def __init__(self, argv):
        # take over and store arguments (or process further parsing)
        self.parser = Parseur()
        isOk, result = self.parser.analyze(argv)

def argInputValidation(argv):
    #checking the command line arguments given by user
    #and returning valid argv, otherwise exit program
    #with an error message.
    return argv

if __name__ == "__main__":
    obj = Capacity(argInputValidation(sys.argv[1:]))
...