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