2010-10-11 117 views
5

guys。我在這裏看到了一些CLI問題,但我仍然想問這個問題以獲得更詳細的答案。如何在Python中製作命令行界面或解釋器

我已經開發了class1.py,class2.py等,並在每個類中實現了函數。例如Operator.py具有添加,減去時間的功能。我怎樣才能爲這些類建立一個命令行界面?

也爲這個CLI,它是一個無限循環內main()進行交互?

CLI如何給出一些反饋,例如,建議用戶進行下一個操作或輸入正確的命令或類型--help並檢查所有可用的命令。像Bash炮彈一樣。

也似乎有從python optparse模塊。是否有一些很好的,完整的或高質量的示例顯示了CLI如何構建?我想借此機會學習如何編寫CLI程序。

我想要的是:我已經開發了幾個類,還有一個GUI來調用這些類的方法。現在我想有一個像GUI一樣的CLI來使用這些類。例如我有類似CDContainer的類(像addCD,removeCD等方法),CD(類似於播放,停止,暫停等方法),並且我有一個可以交互的GUI。現在我想要一個CLI,在bash下,我可以運行這個CLI並調用createCDContainer,addCD,removeCD命令。

如果我使用CMD,

class CDContainerCLI(cmd.Cmd): 

    def do_CDContainer(self, line): 
     print "create CD container" 

    def do_addcd(self, line): 
     print "add cd into the container" 

我怎麼在這裏添加一些選項?例如我想addcd --track 3 --cdname驚悚片 我認爲「--track 3 --cdname驚悚片」他們是addcd函數的4個參數。如何實現?

+1

「我該如何構建這些類的命令行界面?」?這真的很難猜到。你想做什麼,你現在無法做到?你能提供任何提示或例子嗎? – 2010-10-11 23:41:54

+0

HI,S.Lott,請參閱我添加的關於我想要的最後一段。 – pepero 2010-10-23 17:51:22

+0

如果你有一個單獨的問題,那麼你應該把它作爲一個單獨的問題。 – 2010-10-23 18:24:34

回答

5

衍生自cmd.Cmd,根據需要覆蓋各種方法。

+0

嗨,lgnacio,非常感謝你的建議。我試着用cmd.Cmd,它非常好。但有一個問題,如何添加選項。例如如果我確定do_login,我如何添加--username,--password作爲選項? – pepero 2010-10-23 17:28:51

1

我不知道你在找什麼:看來你想建立一個交互的shell,但你也提到optparse,其目的是簡化了模塊接口的創建,該接口可以從系統shell運行,而不是自己提供一個shell。

它看起來像你希望你的模塊實現自己的交互式shell,但也許你也想有一些命令可以從命令行訪問,例如,通過致電your_script the_command --argument value --other-argumentbash或你有什麼。這是optparse旨在提供的那種,但它已被棄用,以支持argparse。​​位於Python 2.7標準庫中,可以以標準方式安裝(例如,作爲模塊的依賴項,或者通過單獨安裝,通過PyPI等),用於較舊的Pythons。

​​使得將代碼中的特定選項或子命令鏈接到入口點(即函數調用)相對簡單。文檔非常詳細,如果您想要創建幾個這樣的界面,那麼值得仔細閱讀。對於高級用法,您可以通過創建custom action來做一些有趣的事情,並使代碼更易於管理。

+0

嗨,直覺,謝謝你的評論。我添加一些關於我想要做什麼的具體評論。如果我使用cmd,我可以有cli,但我不知道如何有選擇。 – pepero 2010-10-23 17:48:14

+0

我不認爲'cmd'提供任何支持將python功能導出到系統shell調用;那*是'argparse'所做的。你想把實際做的東西放在一個單獨的模塊/類中,並從'cmd'和'argparse'中調用它。它看起來像你想要使用[子命令](http://docs.python.org/library/argparse.html#argparse.ArgumentParser.add_subparsers)來得到你想要的。但伊格納西奧是對的:你應該提出另一個問題,尤其是因爲你已經接受了一個與這個問題無關的問題。 – intuited 2010-10-23 20:49:38

0

我想他問的是如何能夠輕鬆地與可選參數處理中交互shell,所以當你使用該程序會是這個樣子:

$ myprogram 
(Cmd) addcd --track 3 --cdname thriller 

所以運行myprogram打開它自己的命令提示符,可以向其發出諸如addcd之類的命令以及可選參數,然後進行處理。

我認爲最好的方法是使用​​以及cmd。代替解析sys.argvparse_args方法可以傳遞一個字符串列表。因此,像下面:

def do_addcd(self, line): 
    parser = argparse.ArgumentParser(prog='addcd') 
    parser.add_argument('--track', type=int) 
    parser.add_argument('--cdname') 

    args = parser.parse_args(line.split()) 
    newcd = CD(args.track, args.cdname) 

與做這樣的事情,因爲我已經試圖做的正是這樣的事情發現了自己的問題,是parse_args趨於如果你提供它退出整個程序參數的錯誤數量以及其他錯誤。在這個用例中需要的行爲是簡單地退出到您的自定義交互式shell,但是如果沒有一些hacky解決方法或子類ArgumentParser和覆蓋parse_args,這將不是一件容易的事情。

+0

作爲上述問題(我剛剛發現)的一個相對乾淨的解決方案,您可以從ArgumentParser派生類並重寫error方法,以便它不會退出,但會引發異常,然後可以在您的Cmd方法。 – ztangent 2010-12-16 11:08:51

+0

這聽起來很有用,它可能值得提交一個針對python的特性請求,因爲它不會退出。 – 2014-02-25 11:14:14