如何用Python制作命令行界面或解释器

如何用Python制作命令行界面或解释器,python,command-line-interface,Python,Command Line Interface,我已经开发了class1.py、class2.py等,并在每个类中实现了函数。e、 g.Operator.py具有加、减、时、除函数。如何为这些类构建命令行界面 同样对于这个CLI,它是否是main()中用于交互的无限循环 CLI如何提供一些反馈,例如建议用户进行下一个操作,或输入正确的命令,或键入--help并检查所有可用的命令,如Bash shell 另外,Python中似乎还有optparse模块。是否有一些好的、完整的或高质量的示例显示了CLI是如何构建的?我想借此机会学习如何编写CLI

我已经开发了class1.py、class2.py等,并在每个类中实现了函数。e、 g.Operator.py具有加、减、时、除函数。如何为这些类构建命令行界面

同样对于这个CLI,它是否是
main()
中用于交互的无限循环

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

另外,Python中似乎还有
optparse
模块。是否有一些好的、完整的或高质量的示例显示了CLI是如何构建的?我想借此机会学习如何编写CLI程序

我已经开发了几个类,还开发了一个GUI来调用这些类中的方法。现在我想要一个CLI,比如GUI,来使用这些类。e、 我有CDContainer(带有addCD、removeCD等方法)、CD(带有play、stop、pause等方法)之类的类,还有一个可以交互的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"
如何在此处添加一些选项?e、 例如,我想
addcd--track 3--cdname thriller

我认为
--track 3--cdname thriller
它们是
addcd
函数的4个参数。如何实现它?

派生自,根据需要重写各种方法

使用cmd模块:

  • 参考:
其他包

您还可以使用托管在pypi上的各种模块,pypi构建在cmd模块之上


我不确定您在寻找什么:您似乎想要构建一个交互式shell,但您也提到了
optpasse
,它旨在简化模块接口的创建,该接口可以从系统shell运行,而不是提供一个shell本身

看起来您确实希望您的模块实现自己的交互式shell,但也可能希望从命令行访问一些命令,例如,通过调用
您的\u脚本,从
bash
或您所拥有的任何东西调用\u命令--argument value--other argument
。这是
optparse
打算提供的那种东西,但它已被弃用而代之以支持
argparse
位于Python 2.7标准库中,对于较旧的Python,可以采用标准方式安装(例如作为模块的依赖项,或通过单独安装等)


argparse
使将特定选项或子命令链接到代码中的入口点(即函数调用)变得相对简单。文档非常详细,如果您可能想制作一些这样的接口,那么值得一读。对于高级使用,您可以通过创建一个

来做一些有趣的事情,并使代码更易于管理。我想他想问的是如何在交互式shell中轻松处理可选参数,因此当您使用该程序时,它会像这样:

$ myprogram
(Cmd) addcd --track 3 --cdname thriller
因此,运行myprogram会打开自己的命令提示符,可以向其发出addcd等命令以及可选参数,然后对其进行处理

我认为最好的方法是使用
argparse
cmd
。可以向
parse_args
方法传递字符串列表,而不是解析
sys.argv
。下面是这样的:

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,但是如果没有一些黑客的解决方法或子类化
ArgumentParser
并覆盖
parse_args

“我如何为这些类构建命令行界面?”?这真的很难猜测。你想做什么现在做不到的事?你能提供一些提示或例子吗?嗨,S.洛特,请看我添加的关于我想要什么的最后一段。如果你有一个单独的问题,那么你应该把它作为一个单独的问题。嗨,lgnacio,非常感谢你的建议。我试过使用cmd.cmd,非常好。但有一个问题,如何添加选项。e、 g.如果我定义为登录,如何添加--username,-password作为选项?您好,Intuite,谢谢您的评论。我添加了一些关于我想做什么的具体评论。如果我使用cmd,我可以使用cli,但我不知道如何使用选项。我认为
cmd
不支持将python功能导出到系统外壳的调用;这就是
argparse
所做的。您希望将实际执行任务的代码放在一个单独的模块/类中,并从
cmd
argparse
调用它。看起来你想用它来得到你想要的。但是Ignacio是对的:你应该问另一个问题,特别是因为你已经接受了一个与这个问题无关的问题。作为我上面描述的问题(我刚刚发现的)的一个相对干净的解决方案,你可以从ArgumentParser派生一个类并重写error方法,这样它就不会退出,而只是引发一个异常,这听起来是一个非常有价值的用法,它可能值得对python提交一个featurerequest,以便它不只是退出。