Python CLI保持执行相同的命令?

时间:2013-07-15 18:45:17

标签: python command-line-interface python-idle

我正在尝试创建一个允许用户执行各种功能的命令行。 例如,如果我在终端中键入“scriptrun”,我希望它从另一个.py文件运行一个函数,然后返回到终端( - >>)。 出于某种原因,如果我键入“scriptrun”,它将正常运行,但如果我再次点击“enter”,它将导致命令再次运行。我基于我发现的Turtle CLI。在我输入帮助后,我希望它只显示一次帮助主题列表,然后如果我继续按Enter键,它将只显示终端,但发生以下情况!:

(终端)帮助

记录命令(输入帮助):

再见颜色转到帮助左侧位置重置scriptrun circle forward heading home home playback right right

(终端)[这里我只是点击进入,但在下面你可以看到它再次调用帮助功能!]

记录命令(输入帮助):

再见颜色转到帮助左侧位置重置scriptrun circle forward heading home home playback right right

(终点站)

下面是我试图找出解决方案的示例代码:

import cmd, sys
from turtle import *
from orion_package import *

class TurtleShell(cmd.Cmd):
    intro = 'Welcome to the turtle shell.   Type help or ? to list commands.\n'
    prompt = '(Terminal) '
    file = None


    # ----- basic turtle commands -----
    def do_forward(self, arg):
        'Move the turtle forward by the specified distance:  FORWARD 10'
        forward(*parse(arg))
    def do_right(self, arg):
        'Turn turtle right by given number of degrees:  RIGHT 20'
        right(*parse(arg))
    def do_left(self, arg):
        'Turn turtle left by given number of degrees:  LEFT 90'
        left(*parse(arg))
    def do_goto(self, arg):
        'Move turtle to an absolute position with changing orientation.  GOTO 100 200'
        goto(*parse(arg))
    def do_home(self, arg):
        'Return turtle to the home postion:  HOME'
        home()
    def do_circle(self, arg):
        'Draw circle with given radius an options extent and steps:  CIRCLE 50'
        circle(*parse(arg))
    def do_position(self, arg):
        'Print the current turle position:  POSITION'
        print('Current position is %d %d\n' % position())
    def do_heading(self, arg):
        'Print the current turle heading in degrees:  HEADING'
        print('Current heading is %d\n' % (heading(),))
    def do_color(self, arg):
        'Set the color:  COLOR BLUE'
        color(arg.lower())
    def do_undo(self, arg):
        'Undo (repeatedly) the last turtle action(s):  UNDO'
    def do_reset(self, arg):
        'Clear the screen and return turtle to center:  RESET'
        reset()
    def do_bye(self, arg):
        'Stop recording, close the turtle window, and exit:  BYE'
        print('Thank you for using Turtle')
        self.close()
        bye()
        return True


    # ----- record and playback -----
    def do_record(self, arg):
        'Save future commands to filename:  RECORD rose.cmd'
        self.file = open(arg, 'w')
    def do_playback(self, arg):
        'Playback commands from a file:  PLAYBACK rose.cmd'
        self.close()
        with open(arg) as f:
            self.cmdqueue.extend(f.read().splitlines())
    def precmd(self, line):
        line = line.lower()
        if self.file and 'playback' not in line:
            print(line, file=self.file)
        return line
    def close(self):
        if self.file:
            self.file.close()
            self.file = None

    def do_scriptrun(self, arg):
        'Run the script: SCRIPTRUN'
        print("Let's run this thing!  :)")
        scriptrun()


def parse(arg):
    'Convert a series of zero or more numbers to an argument tuple'
    return tuple(map(int, arg.split()))


if __name__ == '__main__':
    TurtleShell().cmdloop()

非常感谢任何有关解决方案的帮助或建议!谢谢! :)

2 个答案:

答案 0 :(得分:1)

>>> help (cmd)

列出的第四项是

“键入空行重复上一个命令”。

所以这就像记录在案一样。

答案 1 :(得分:1)

似乎最好的解决方案是简单地创建自己的cmd版本,以便修改此条件,然后在此处将此项包含在项目中并导入它,这样您就可以重复(终端):每次你按下回车而不是重复最后一个命令!