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 nco socatpara 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 pythondesde 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 stdinpython, en realidad estás escribiendo en el ptyterminal psuedo, que es un dispositivo kernel, no un simple archivo. Utiliza ioctlno ready 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 fifoo 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 screensolo para entrada
# start screen
$ screen -dmS python python
# send command to input
$ screen -S python -X 'print \"hello\"'
# view output
$ screen -S python -x