在Python3中使用嵌入式argparse

时间:2018-05-24 18:13:40

标签: python argparse

我想创建一个可以由命令行和其他模块使用的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()

但是有两个主要问题,当然还有一些我还没有发现:

  • args未正确解析(例如双引号),因为split函数具有"空格"分离器
  • 使用-h标志关闭程序

我确信让另一个Parseur课程变得无用/不好,并且有一个解决方法。 通过子进程启动模块也不是一个好主意:我想在这种情况下获取返回的对象。 你能帮我找一个很酷的方式去做我想要的吗? 谢谢。

PS:在线公式上写代码真是太痛苦了^^。

1 个答案:

答案 0 :(得分:0)

你并不遥远。我会这样做:

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:]))