¿Cómo escribir datos en el proceso STDIN del proceso externo?

Estoy buscando formas de escribir datos en el STDIN del proceso existente a partir de procesos externos, y encontré una pregunta similar. ¿ Cómo se transmiten los datos al STDIN de un progtwig desde diferentes procesos locales / remotos en Python? en stackoverlow.

En ese hilo, @Michael dice que podemos obtener descriptores de archivos del proceso existente en la ruta como a continuación, y se les permite escribir datos en ellos en Linux.

 /proc/$PID/fd/ 

Por lo tanto, he creado un script simple que se enumera a continuación para probar la escritura de datos en STDIN (y TTY ) del script desde un 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 las rutas de STDIN y TTY y luego, espera a que uno escriba su STDIN .

Lancé este script y recibí mensajes a continuación.

 Try commands below $ echo 'foobar' > /dev/pts/6 $ echo 'foobar' > /proc/3308/fd/0 

Entonces, 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 print("read :: [" + sys.stdin.readline() + "]") línea print("read :: [" + sys.stdin.readline() + "]") no se ejecutó.

¿Hay alguna forma de escribir datos de procesos externos al STDIN del proceso existente (u otros descriptores de archivos), es decir, invocar la ejecución de la print("read :: [" + sys.stdin.readline() + "]") línea print("read :: [" + sys.stdin.readline() + "]") de otros procesos?

Tu código no funcionará
/proc/pid/fd/0 es un enlace al archivo /dev/pts/6 .

$ echo ‘foobar’> / dev / pts / 6
$ echo ‘foobar’> / proc / pid / fd / 0

Dado que ambos comandos escriben en la terminal. Esta entrada va a la terminal y no al proceso.

Funcionará si stdin inicialmente es una tubería.
Por ejemplo, test.py es:

 #!/usr/bin/python import os, sys if __name__ == "__main__": print("Try commands below") print("$ echo 'foobar' > /proc/{0}/fd/0".format(os.getpid())) while True: print("read :: [" + sys.stdin.readline() + "]") pass 

Ejecuta esto como:

 $ (while [ 1 ]; do sleep 1; done) | python test.py 

Ahora desde otro terminal escribe algo a /proc/pid/fd/0 y llegará a test.py

Quiero dejar aquí un ejemplo que encontré útil. Es una ligera modificación del verdadero truco anterior que falló intermitentemente en mi máquina.

 # pipe cat to your long running process ( cat ) | ./your_server & server_pid=$! # send an echo to your cat process that will close cat and in my hypothetical case the server too echo "quit\n" > "/proc/$server_pid/fd/0" 

Fue útil para mí porque por razones particulares no pude usar mkfifo , que es perfecto para este escenario.

    Intereting Posts