首页 文章

如何在Python docopt使用中实际调用程序?

提问于
浏览
0

我试图在Python中使用 docopt 模块来解析脚本的命令行参数 . 可以直接调用此脚本,也可以通过使用PyInstaller构建的.exe调用此脚本 . 我想在使用部分中使用程序的实际名称,这与程序的调用方式有所不同(请注意,此处有许多相互排斥的选项,我已经省略了):

> py script.py
  Usage:
      script.py -foo <foo>
      script.py -bar <bar>
      ...

> dist/script.exe
  Usage:
      dist/script.exe -foo <foo>
      dist/script.exe -bar <bar>
      ...

我可以通过在传递给docopt的字符串上使用 .format() 来做到这一点,但这会变得很难看,并且无法将选项指定为模块docstring:

doc = """
  Usage:
      {} -foo <foo>
      {} -bar <bar>
      ...
  """.format(sys.argv[0], sys.argv[0])
args = docopt(doc, ...)

有没有更好的办法?

1 回答

  • 0

    正如您在当前主分支中的inspecting the code所看到的那样,docopt没有太多功能来获取它解析和显示的字符串 .

    然而,DocoptExit exception it raises实际上是显示用法消息,所以你可以猴子补丁,如下面的 test.py 所示

    """ Usage:
        PROGRAM --foo <foo>
        PROGRAM --bar <bar>
    """
    import sys, docopt
    
    class MyExit(SystemExit):
        usage = ''
        def __init__(self, message=''):
            usage = self.usage.replace("PROGRAM",sys.argv[0])
            SystemExit.__init__(self, (message + '\n' + usage).strip())
    
    docopt.DocoptExit = MyExit
    args = docopt.docopt(__doc__, version='0.0.1-alpha')
    print str(args)
    

    样品运行

    bash-3.2$ python test.py
    Usage:
        test.py --foo <foo>
        test.py --bar <bar>
    
    bash-3.2$ python test.py --foo foo
    {'--bar': False,
     '--foo': True,
     '<bar>': None,
     '<foo>': 'foo'}
    

相关问题