2011-08-30 20 views
7

Me gustaría imprimir una cadena a la línea de comando/terminal en Windows y luego editar/cambiar la cadena y volver a leerla. ¿Alguien sabe como hacerlo? GraciasPython: cómo modificar/editar la cadena impresa en la pantalla y leerla de nuevo?

print "Hell" 
Hello! <---Edit it on the screen 
s = raw_input() 
print s 
Hello! 
+6

En general, no se puede - stdout es de solo escritura. Si desea usar el terminal como buffer mutable, use maldiciones o vuelva a imprimir todo el contenido de la pantalla en cada iteración. – delnan

+2

Sí, si quieres una solución sucia, podrías probar la solución de volver a imprimir conectando '' sys.stdout'' con un objeto similar a un archivo personalizado. De lo contrario, debes pasar un tiempo aprendiendo la librería '' maldiciones''.Aquí hay un buen tutorial sobre '' maldiciones'': http://docs.python.org/howto/curses.html –

+0

Gracias. entonces no hay una manera fácil de hacer esto. maldiciones no es para Windows por cierto ... – TMS

Respuesta

2

Podría hacer algunos trucos ANSI para que parezca que está editando en la pantalla. Check out this link (también similar a this SO post on colors).

Esto solo funcionaría en ciertos terminales y configuraciones. ymmv.

script de Python Este trabajó en mi terminal de Cygwin en Win7:

print 'hell' 
print '\033[1A\033[4CO!' 

termina la impresión hellO! en una línea. La segunda impresión mueve el cursor hacia arriba una línea (Esc [1A) luego más de 4 caracteres (Esc [4C]) y luego imprime el 'O!'.

No te dejaría leerlo ... solo una 1/2 respuesta.

0

os.sys.stdout es solo de escritura, pero puede borrar algunos caracteres de la última línea con \b o toda la línea con \r, siempre que no haya escrito un retorno de carro.

(sin embargo, véase también my question acerca de las limitaciones a la pitón consola/terminal estándar)

vez que hice algo de ejercicio salida (incluyendo una barra de estado) para escribir, borrar o animar si se quiere, tal vez es servicial :

from __future__ import print_function 
import sys, time 

# status generator 
def range_with_status(total): 
    n=0 
    while n<total: 
     done = '#'*(n+1) 
     todo = '-'*(total-n-1) 
     s = '<{0}>'.format(done+todo) 
     if not todo: 
      s+='\n' 
     if n>0: 
      s = '\r'+s 
     sys.stdout.write(s) 
     sys.stdout.flush() 
     yield n 
     n+=1 

print ('doing something ...') 
for i in range_with_status(10): 
    time.sleep(0.1) 

print('ready') 
time.sleep(0.4) 


print ('And now for something completely different ...') 
time.sleep(0.5) 
msg = 'I am going to erase this line from the console window.' 
sys.stdout.write(msg); sys.stdout.flush() 
time.sleep(1) 
sys.stdout.write('\r' + ' '*len(msg)) 
sys.stdout.flush() 
time.sleep(0.5) 
print('\rdid I succeed?') 
time.sleep(4) 
0

raw_input acepta un parámetro para un "mensaje de aviso", por lo que utilizar para emitir el mensaje, y luego usarlo sobre lo que recibe. Sin embargo, esto no le permitirá retroceder en el prompt, porque es un aviso y no es realmente parte de la entrada.

s = "Hell" + raw_input("Hell") 
print s 
0

Si es para sus propios fines, entonces aquí un corte wee sucia usando el portapapeles sin perder lo que había antes:

def edit_text_at_terminal(text_to_edit): 
    import pyperclip 

    # Save old clipboard contents so user doesn't lose them 
    old_clipboard_contents = pyperclip.paste() 

    #place text you want to edit in the clipboard 
    pyperclip.copy(text_to_edit) 

    # If you're on Windows, and ctrl+v works, you can do this: 
    import win32com.client 
    shell = win32com.client.Dispatch("WScript.Shell") 
    shell.SendKeys("^v") 

    # Otherwise you should tell the user to type ctrl+v 
    msg = "Type ctrl+v (your old clipboard contents will be restored):\n" 

    # Get the new value, the old value will have been pasted 
    new_value= str(raw_input(msg)) 

    # restore the old clipboard contents before returning new value 
    pyperclip.copy(old_clipboard_contents) 
    return new_value 

Tenga en cuenta que ctrl + v no funciona en todos los terminales, notablemente el predeterminado de Windows (hay ways to make it work, aunque recomiendo usar ConEmu en su lugar).

La automatización de las teclas para otros sistemas operativos implicará un proceso diferente.

Recuerde que este es un truco rápido y no una solución "adecuada". No seré responsable por la pérdida de disertaciones de doctorado almacenadas momentáneamente en su portapapeles.

Para una solución adecuada hay mejores enfoques como curses para Linux, y en Windows vale la pena mirar en AutHotKey (tal vez arrojar un cuadro de entrada, o hacer algunas combinaciones de teclas/wizardry portapapeles).

Cuestiones relacionadas