2017-07-17 72 views
1

我正在创建一个使用子命令模式的命令行界面的Python包:kevlar countkevlar partition等等。 CLI的工作原理非常奇妙,现在我试图将CLI添加到我的Sphinx文档中。在寻找解决方案时,我碰到了sphinxcontrib-autoprogram,这似乎正是我想要的,甚至明确地处理子命令。但是当我执行狮身人面像构建时,出现以下错误。抓取解析器后sphinxcontrib-autoprogram解析参数?

sphinx-build -b html -d _build/doctrees . _build/html 
Running Sphinx v1.6.3 
loading pickled environment... not yet created 
building [mo]: targets for 0 po files that are out of date 
building [html]: targets for 5 source files that are out of date 
updating environment: 5 added, 0 changed, 0 removed 
reading sources... [ 20%] cli 
usage: sphinx-build [-h] [-v] [-l F] cmd ... 
sphinx-build: error: argument cmd: invalid choice: 'html' (choose from 'reaugment', 'dump', 'novel', 'collect', 'mutate', 'assemble', 'filter', 'partition', 'count', 'localize') 
make[1]: *** [html] Error 2 
make: *** [doc] Error 2 

这似乎是狮身人面像的扩展,不仅创造了argparse对象(预期),但也呼吁它(意外)parse_args()。 “无效的”html参数来自sphinx命令行构建调用,但被误认为是来自我的图书馆CLI的子命令之一。

我的语法似乎与sphinxcontrib-autoprogram文档相匹配。

.. autoprogram:: cli:parser 
    :prog: kevlar 

什么可能导致此行为?


我不知道,如果这些细节有关的问题,但如果他们是:

+0

我不确定它是否有帮助,但是这个问题让我想起了https://stackoverflow.com/q/6912025/407651(这是关于optparse而不是argparse)。 – mzjn

回答

0

首先,确保您的程序使用了argparse,其是用于autoprogram一个要求:

扫描argparse.ArgumentParser对象,然后将其扩展到一组.. program::.. option::指令。

其次,您使用的语法可能不正确。它看起来像你从第一个例子复制pastad而不是读取其usage。具体做法是:

.. autoprogram:: module:parser 

module是模块的虚线进口名称,parser是指argparse.ArgumentParser对象或创建并返回一个Python表达式的变量。

你的情况

因此,假设您的parser()创建并返回一个argparse.ArgumentParser,你的语法将是这样或接近它:

.. autoprogram:: kevlar.cli:parser() 
    :prog: kevlar 

难的是找出确切的,正确的module:parser替代。

为了与另一个示例进行比较,请参见金字塔文档pcreatesource program,来源reST filerendered HTML

+0

“困难的部分是找出确切的,正确的'module:parser'替换。”呃,这个错误信息让我很清楚,正在调用正确的函数。问题是'ArgumentParser'对象似乎被*执行*而不是*被检查*。 –

0

您应该将​​实例加载到创建相同​​实例但不自行执行解析器的单独模块中。或者你的模块可以检测到它是在自动程序中加载的,并在​​实例构建之后退出。

例如,PoC-Library使用非常大的带有许多子分析器的命令行解析器。前端脚本是这样的:py/PoC.py

docs目录包含一个虚拟前端,它会触发​​的实例化,但会在其构建后中止。

代码以假负载的PoC:

from sys import path as sys_path 
sys_path.append("../py") 

from PoC import PileOfCores 

# entry point 
parser = PileOfCores(False, False, False, True, sphinx=True).MainParser 

来源:docs/PoCSphinx.py

代码来加载并中止如果加载由斯芬克斯:

def __init__(self, debug, verbose, quiet, dryRun, sphinx=False): 
    # Call the initializer of ILogable 
    # -------------------------------------------------------------------------- 
    if quiet:  severity = Severity.Quiet 
    elif debug: severity = Severity.Debug 
    elif verbose: severity = Severity.Verbose 
    else:   severity = Severity.Normal 

    logger = Logger(severity, printToStdOut=True) 
    ILogable.__init__(self, logger=logger) 

    # Call the constructor of the ArgParseMixin 
    # -------------------------------------------------------------------------- 
    description = dedent("""\ 
     This is the PoC-Library Service Tool. 
     """) 
    epilog = "Pile-of-Cores" 

    class HelpFormatter(RawDescriptionHelpFormatter): 
     def __init__(self, *args, **kwargs): 
      kwargs['max_help_position'] = 25 
      super().__init__(*args, **kwargs) 

    ArgParseMixin.__init__(self, description=description, epilog=epilog, formatter_class=HelpFormatter, add_help=False) 
    if sphinx: return 

来源:py/PoC.py

PileOfCores类实现一个属性以返回主分析器对象MainParser,该对象存储在autoprogram预期的变量parser中。