vimrc tutorial commands python vim editor command-line-interface

tutorial - llama un EDITOR(vim) desde un script python



vim tutorial (4)

El PIPE es el problema. VIM es una aplicación que depende del hecho de que los canales stdin / stdout son terminales y no archivos o tuberías. Quitar los parámetros stdin / stdout funcionó para mí.

Evitaría usar os.system ya que should ser reemplazado por el módulo de subproceso.

Quiero llamar a un editor en una secuencia de comandos python para solicitar la opinión del usuario, al igual que hace crontab e o git commit .

Aquí hay un fragmento de lo que he estado ejecutando hasta ahora. (En el futuro, podría usar $ EDITOR en lugar de vim para que la gente pueda personalizarlo a su gusto).

tmp_file = ''/tmp/up.''+''''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(6)) edit_call = [ "vim",tmp_file] edit = subprocess.Popen(edit_call,stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True )

Mi problema es que al usar Popen, parece que mi E / S con la secuencia de comandos python va a la copia en ejecución de vim, y no puedo encontrar la manera de pasar la E / S a vim. Obtuve el siguiente error.

Vim: Warning: Output is not to a terminal Vim: Warning: Input is not from a terminal

¿Cuál es la mejor manera de llamar un programa de CLI desde Python, controlarlo y luego devolverlo una vez que haya terminado con él?


En python3: ''str'' does not support the buffer interface

$ python3 editor.py Traceback (most recent call last): File "editor.py", line 9, in <module> tf.write(initial_message) File "/usr/lib/python3.4/tempfile.py", line 399, in func_wrapper return func(*args, **kwargs) TypeError: ''str'' does not support the buffer interface

Para python3, use initial_message = b"" para declarar la cadena almacenada.

Luego use edited_message.decode("utf-8") para decodificar el buffer en una cadena.

import sys, tempfile, os from subprocess import call EDITOR = os.environ.get(''EDITOR'',''vim'') #that easy! initial_message = b"" # if you want to set up the file somehow with tempfile.NamedTemporaryFile(suffix=".tmp") as tf: tf.write(initial_message) tf.flush() call([EDITOR, tf.name]) # do the parsing with `tf` using regular File operations. # for instance: tf.seek(0) edited_message = tf.read() print (edited_message.decode("utf-8"))

Resultado:

$ python3 editor.py look a string


Llamar $ EDITOR es fácil. He escrito este tipo de código para llamar al editor:

import sys, tempfile, os from subprocess import call EDITOR = os.environ.get(''EDITOR'',''vim'') #that easy! initial_message = "" # if you want to set up the file somehow with tempfile.NamedTemporaryFile(suffix=".tmp") as tf: tf.write(initial_message) tf.flush() call([EDITOR, tf.name]) # do the parsing with `tf` using regular File operations. # for instance: tf.seek(0) edited_message = tf.read()

Lo bueno aquí es que las bibliotecas manejan la creación y eliminación del archivo temporal.


Paquete python-editor :

$ pip install python-editor $ python >>> import editor >>> result = editor.edit(contents="text to put in editor/n")

Más detalles aquí: https://github.com/fmoo/python-editor