¿La CLI de Python sigue ejecutando el mismo comando?

3

Estoy tratando de crear una línea de comando que permita a un usuario realizar varias funciones. Por ejemplo, si escribo "scriptrun" en la terminal, quiero que ejecute una función desde otro archivo .py y luego regrese a la terminal (- >>). Por alguna razón, si escribo "scriptrun", se ejecutará correctamente, pero si presiono "enter" nuevamente, hará que el comando se ejecute nuevamente. Lo estoy basando en una CLI de Turtle que encontré. Después de ingresar a la ayuda, quiero que muestre la lista de temas de ayuda solo una vez, y luego, si sigo presionando enter, solo mostrará la terminal, ¡pero está sucediendo lo siguiente !:

(Terminal) ayuda

Comandos documentados (escriba ayuda):

adiós color ir a ayuda posición izquierda restablecer scriptrun círculo adelante rumbo inicio reproducción grabar derecha deshacer

(Terminal) [Aquí acabo de presionar enter, ¡pero debajo puedes ver que está llamando a la función de ayuda nuevamente!]

Comandos documentados (escriba ayuda):

adiós color ir a ayuda posición izquierda restablecer scriptrun círculo adelante rumbo inicio reproducción grabar derecha deshacer

(Terminal)

A continuación se muestra el código de muestra para el que estoy tratando de encontrar la solución:

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()

¡Cualquier ayuda o consejo para una solución es muy apreciada! ¡Gracias! :)

1

Parece que la mejor solución es simplemente hacer tu propia versión de cmd de tal manera que modifiques esta condición y desde aquí incluyas esto con tu proyecto e importes y de esta manera puedes hacer que repita el (Terminal): cada vez que presione enter en lugar de repetir el último comando!

1
  • Estaba pensando lo mismo. Lo que terminé haciendo fue tomar cmd, modificarlo como cmd2 en mi directorio de trabajo, luego cambiar la declaración de retorno de la línea vacía a la siguiente: ¡ if self.lastcmd: return []Una solución simple! :) 16/07/2013 a las 11:55
1
>>> help (cmd)

El cuarto elemento enumerado es

"Escribir una línea vacía repite el último comando".

Entonces esto se está comportando como está documentado.

5
  • hmm gracias por señalar esto, Jon. ¿Hay alguna forma posible de solucionar esto, quizás sin tener que modificar el archivo cmd? 15/07/2013 a las 19:21
  • de hecho, no está repitiendo el último comando para todos los casos. Por ejemplo, cuando intento restablecer o colorear AZUL, por ejemplo, ¡este no es el caso! ... hmmm 15/07/2013 a las 19:23
  • 1
    ¿Le gustaría que ignorara una línea en blanco? Bueno, nunca antes había trabajado con cmd, pero al mirar la documentación, veo que hay algunos ganchos que podrías usar. Soy optimista sobre el gancho de línea vacía () en particular. :) docs.python.org/2/library/cmd.html 15/07/2013 a las 19:26
  • Sí, el objetivo es básicamente que se repita indefinidamente: (Terminal): (Terminal): (Terminal): Hasta que deje de ingresar líneas vacías. ¡Gracias, lo comprobaré! 15/07/2013 a las 19:28
  • 1
    ¡No gracias! No me había encontrado con la biblioteca cmd antes, ¡parece bastante útil! 15/07/2013 a las 19:36