如何在python中创建命令行界面或解释器

时间:2010-10-11 21:40:54

标签: python command-line-interface

人。我在这里看到了一些CLI问题,但我仍然想问这个问题以获得更详细的答案。

我已经开发了class1.py,class2.py等,每个类中都实现了函数。例如Operator.py具有add,minus,time,devide函数。如何为这些类构建命令行界面?

对于这个CLI,它是main()内的一个无限循环用于交互吗?

CLI如何提供一些反馈,例如,建议用户进行下一步操作或输入正确的命令或键入--help并检查所有可用命令。像Bash shell一样。

似乎也有来自python的optparse模块。是否有一些好的,完整的或高质量的样本显示了如何构建CLI?我想借此机会学习如何编写CLI程序。

我想要的是:我已经开发了几个类,还有一个GUI来调用这些类中的方法。现在我希望有一个CLI,比如GUI,可以使用这些类。例如我有像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 thriller”是addcd函数的4个参数。如何实现?

5 个答案:

答案 0 :(得分:5)

cmd.Cmd派生,根据需要覆盖各种方法。

答案 1 :(得分:2)

答案 2 :(得分:1)

  

使用cmd模块:

  

其他套餐

您还可以使用在cmd模块

之上构建的pypi上托管的各种模块

答案 3 :(得分:1)

我不确定你在寻找什么:似乎你想构建一个交互式shell,但你也提到了optparse,它旨在简化可以运行的模块接口的创建来自系统shell ,而不是自己提供shell。

看起来您确实希望您的模块实现自己的交互式shell,但也许您还希望从命令行访问某些命令,例如:从your_script the_command --argument value --other-argument致电bash或者你有什么。这是optparse旨在提供的内容,但已弃用argparseargparse位于Python 2.7标准库中,可以以标准方式安装(例如,作为模块的依赖项,或通过PyPI等单独安装),用于较旧的Pythons。

argparse使得将特定选项或子命令链接到代码中的入口点(即函数调用)变得相对简单。文档非常详细,如果您可能想要制作一些这样的接口,则值得彻底阅读。对于高级用法,您可以通过创建custom action来做一些有趣的事情,并使代码更易于管理。

答案 4 :(得分:0)

我认为他所询问的是如何在交互式shell中轻松处理 中的可选参数,因此当您使用该程序时,它看起来像这样:

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

因此运行myprogram会打开自己的命令提示符,可以发出addcd等命令以及可选参数,然后进行处理。

我认为,最好的方法是使用argparsecmdsys.argv方法可以传递一个字符串列表,而不是解析parse_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,这将不容易做到。