Pregunta

Tengo un script en Python que necesita llamar al definido $EDITOR o $VISUAL.Cuando se llama solo al script de Python, puedo iniciar el $EDITOR sin problemas, pero en el momento en que canalizo algo al script de Python, el $EDITOR no puede iniciarse.Ahora mismo estoy usando nano, lo que muestra

Recibido SIGHUP o SIGTERM

cada vez.Parece ser el mismo problema. descrito aquí.

sinister:Programming [1313]$ echo "import os;os.system('nano')" > "sample.py" 
sinister:Programming [1314]$ python sample.py
# nano is successfully launched here.
sinister:Programming [1315]$ echo "It dies here." | python sample.py 
Received SIGHUP or SIGTERM

Buffer written to nano.save.1

EDITAR:Aclaración;Dentro del programa, no me comunico con el editor.El código es el siguiente:

editorprocess = subprocess.Popen([editor or "vi", temppath])
editorreturncode = os.waitpid(editorprocess.pid, 0)[1]
¿Fue útil?

Solución

Cuando canalizas algo a un proceso, la tubería se conecta a la entrada estándar de ese proceso.Esto significa que la entrada de su terminal no estará conectada al editor.La mayoría de los editores también comprueban si su entrada estándar es un terminal (isatty), que no es una tubería;y si no es una terminal, se negarán a iniciar.En el caso de nano, esto parece hacer que salga con el mensaje que incluiste:

% echo | nano
Received SIGHUP or SIGTERM

Deberá proporcionar la entrada a su secuencia de comandos Python de otra manera, como a través de un archivo, si desea poder pasar su entrada estándar a un editor basado en terminal.

Ahora que ha aclarado su pregunta, no desea que el proceso de Python stdin adjunto al editor, puede modificar su código de la siguiente manera:

editorprocess = subprocess.Popen([editor or "vi", temppath],
                                 stdin=open('/dev/tty', 'r'))

Otros consejos

El caso concreto de find -type f | vidir - se maneja aquí:

foreach my $item (@ARGV) {
    if ($item eq "-") {
        push @dir, map { chomp; $_ } <STDIN>;
        close STDIN;
        open(STDIN, "/dev/tty") || die "reopen: $!\n";
    }

También puedes recrear este comportamiento en Python:

#!/usr/bin/python

import os
import sys

sys.stdin.close()
o = os.open("/dev/tty", os.O_RDONLY)
os.dup2(o, 0)
os.system('vim')

Por supuesto, cierra el descriptor de archivo de entrada estándar, por lo que si tiene la intención de leerlo nuevamente después de iniciar el editor, probablemente debería duplicar su descriptor de archivo antes de cerrarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top