【问题标题】:How to use the actual invocation of the program in Python docopt usages?如何在 Python docopt 用法中使用程序的实际调用?
【发布时间】:2017-09-10 00:06:29
【问题描述】:

我正在尝试使用 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, ...)

有没有更好的方法?

【问题讨论】:

    标签: python docopt


    【解决方案1】:

    从当前 master 分支中的 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'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-06
      • 2022-01-24
      • 2021-04-16
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多