Estoy buscando formas de escribir datos en el proceso existente STDIN
de procesos externos, y encontré la pregunta similar How do you stream data into the STDIN of a program from different local/remote processes in Python? en stackoverlow.Cómo escribir datos en el proceso STDIN del proceso externo?
En ese hilo, @Michael dice que podemos obtener descriptores de archivos del proceso existente en el camino como se muestra a continuación, y se les permite escribir datos en ellos en Linux.
/proc/$PID/fd/
Por lo tanto, he creado un script sencillo que aparece a continuación para probar escritura de datos en la secuencia de comandos de STDIN
(y TTY
) de proceso externo.
#!/usr/bin/env python
import os, sys
def get_ttyname():
for f in sys.stdin, sys.stdout, sys.stderr:
if f.isatty():
return os.ttyname(f.fileno())
return None
if __name__ == "__main__":
print("Try commands below")
print("$ echo 'foobar' > {0}".format(get_ttyname()))
print("$ echo 'foobar' > /proc/{0}/fd/0".format(os.getpid()))
print("read :: [" + sys.stdin.readline() + "]")
Este script de prueba muestra caminos de STDIN
y TTY
y luego, esperar a que uno de escribirlo es STDIN
.
Lancé este script y obtuve mensajes a continuación.
Try commands below
$ echo 'foobar' > /dev/pts/6
$ echo 'foobar' > /proc/3308/fd/0
Así, ejecuté el comando echo 'foobar' > /dev/pts/6
y echo 'foobar' > /proc/3308/fd/0
desde otro terminal. Después de la ejecución de ambos comandos, el mensaje foobar
se muestra dos veces en el terminal en el que se ejecuta el script de prueba, pero eso es todo. La línea print("read :: [" + sys.stdin.readline() + "]")
no se ejecutó.
¿Hay alguna manera de escribir datos de procesos externos al proceso existente STDIN
(u otros descriptores de archivos), es decir, invocar la ejecución de la línea print("read :: [" + sys.stdin.readline() + "]")
desde otros procesos?
¿Haría un tubo con nombre (ver 'man mkfifo') lo que quiere? – Andy
Gracias por la sugerencia.Echaré un vistazo a named-pipe. – mooz