【问题标题】:Simulating CLI Shell with python用 python 模拟 CLI Shell
【发布时间】:2012-07-16 07:13:50
【问题描述】:

我被要求用 Python 模拟 CLI。

这就是我所做的

def somefunction(a,b):
    //codes here
//consider some other functions too

print "--- StackOverFlow Shell ---"
while True:
    user_input = raw_input("#> ")
    splitit = user_input.split(" ")
    if splitit[0] == "add":
        firstNum = splitit[1]
        sNum = splitit[2]
        result = somefunction(firstNum, sNum)
        print result
    //consider some other elif blocks with "sub", "div", etc
    else:
        print "Invalid Command"

我也会检查列表的长度,这里“拆分”我将只允许 3 个参数,第一个是操作,第二个和第三个是执行某些函数的参数,以防参数大于 3,为此我做了检查。

虽然我设法让它发挥作用,但有没有更好的方法来达到同样的效果?

【问题讨论】:

  • 如果要超过 10 个命令,如果您将自己的语法与解析和逻辑“按命令”混合使用,您很快就会陷入困境,并且 shell 将变得无法维护。将其拆分为标记器、解析器(带有一些命令数据库)和解释器(执行单元),这是一个管道,原始输入在执行之前通过这些步骤,而不是为每个命令重复相同的步骤。
  • 是的,对于 2-3 个函数,我很好......但我被要求在初始化时不要传递参数。 like myProgram.py

标签: python command-line-interface


【解决方案1】:

使用pythonCMD模块:

查看以下页面中给出的几个示例

http://docs.python.org/library/cmd.html # 支持面向行的命令解释器

http://www.doughellmann.com/PyMOTW/cmd - # 创建面向行的​​命令处理器

prompt 可以设置为每次要求用户输入新命令时要打印的字符串。

intro 是程序开始时打印的“欢迎”消息。

例如:

import cmd

class HelloWorld(cmd.Cmd):
    """Simple command processor example."""

    prompt = 'prompt: '
    intro = "Simple command processor example."

【讨论】:

  • 确实我检查了一下,这很好,但不知何故我无法修改提示。 cmd 模块给出类似 (cmd) 的提示,如果可以根据我的需要自定义提示,如“#>”或“StackOverFlow~#”,那么我可以接受,你能帮我吗?
  • 谢谢,我想这就是我的老师要找的。接受!
【解决方案2】:

您应该查看 VTE 库:

http://earobinson.wordpress.com/2007/09/10/python-vteterminal-example/

它工作得非常好,您可以非常轻松地自定义它的外观。就是这么简单:

    # make terminal
    terminal = vte.Terminal()
    terminal.connect ("child-exited", lambda term: gtk.main_quit())
    terminal.fork_command()

    # put the terminal in a scrollable window
    terminal_window = gtk.ScrolledWindow()
    terminal_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
    terminal_window.add(terminal)

【讨论】:

  • 感谢您的回复......虽然我的老师想要 cmd 模块,但 vte 吸引了我,也许我可以让她对 VTE 库的理解感到惊讶:)
猜你喜欢
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多