Enviar comentarios a intérpretes / intérpretes de esta manera es muy propenso a problemas y es muy difícil que funcione de manera confiable.
La forma correcta es usar sockets, es por eso que se inventaron, puede hacerlo en la línea de comandos usando ncat
nc
o socat
para vincular un proceso de Python a un socket simple. O escriba una aplicación simple de Python que se una al puerto y escuche los comandos para interpretar en un socket.
los sockets pueden ser locales y no estar expuestos a ninguna interfaz web.
El problema es que si comienzas python
desde la línea de comando, normalmente está conectado a tu shell que está conectado a una terminal, de hecho podemos ver
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
así que cuando escribes en stdin
python, en realidad estás escribiendo en el pty
terminal psuedo, que es un dispositivo kernel, no un simple archivo. Utiliza ioctl
no read
y write
, por lo verá una salida en la pantalla, pero no va a ser enviado al proceso generado ( python
)
Una forma de replicar lo que está intentando es con un fifo
o named pipe
.
# make pipe
$ mkfifo python_i.pipe
# start python interactive with pipe input
# Will print to pty output unless redirected
$ python -i < python_i.pipe &
# keep pipe open
$ sleep infinity > python_i.pipe &
# interact with the interpreter
$ echo "print \"hello\"" >> python_i.pipe
También puede usar screen
solo para entrada
# start screen
$ screen -dmS python python
# send command to input
$ screen -S python -X 'print \"hello\"'
# view output
$ screen -S python -x