2017-07-17 68 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中。