8

我有一個Python模塊,我正在編寫一個使用Sphinx的教程,包括doctests。有沒有辦法使用doctest和sphinx來測試和記錄命令行應用程序?

該模塊附帶一些幫助程序。

我想在文檔中包含這些幫助程序doctest檢查標準輸出在當前程序版本和文檔之間是否同步。

我想我可以使用sh模塊或popen來檢查給定程序的標準輸出,但我更喜歡這些技巧不會顯示在文檔中,否則非程序員用戶肯定會丟失。

有沒有辦法做到這一點?

+1

爲什麼downvotes? – jterrace

+0

可能的重複http://stackoverflow.com/questions/10886841/sphinx-and-argparse-autodocumenting-command-line-scripts –

+0

我不認爲這是重複的。另一個問題僅僅是關於自動文檔。這主要是關於一個更有趣的話題,使用doctest來測試命令行工具。 –

回答

1

doctest模塊只檢查可以從python交互式提示符運行的語句。

命令行工具可以從Python交互式提示符下使用subprocess模塊調用:

# Create Helper Function 
>>> import subprocess 
>>> run_commandline = lambda cmd: subprocess.check_output(cmd, shell=True).decode() 

# Doctestable command-line calls 
>>> print(run_commandline('cal 7 2017')) 
    July 2017 
Su Mo Tu We Th Fr Sa 
        1 
2 3 4 5 6 7 8 
9 10 11 12 13 14 15 
16 17 18 19 20 21 22 
23 24 25 26 27 28 29 
30 31 

>>> print(run_commandline('echo $BASH_VERSION')) 
3.2.57(1)-release 

有可能一些方法來破解文檔測試或獅身人面像,讓你更直接地想要的東西,但這種技術的用途Doctest,sphinx和subprocess的廣告API完全按照它們設計的方式使用(doctest被設計爲重放docstrings中的交互式提示會話,subprocess被設計爲直接從python運行命令行工具並捕獲它們的輸出)。

我想我可以使用SH模塊,或popen方法檢查一個給定程序的標準 輸出,但我更喜歡那些招數不顯示 成的文檔,或者非程序員用戶將當然 失去。

兩個想法:首先,這些調用的細節大多可以隱藏在輔助函數中以最大限度地減少分心。其次,如果您需要從Python調用命令行程序,使用popen子進程並不是一個竅門,因爲這些是專門爲從Python進行調用而設計的工具。

相關問題