Inviare input a shell / interpreti in questo modo è molto soggetto a problemi e molto difficile far funzionare in modo affidabile.
Il modo corretto è usare i socket, ecco perché sono stati inventati, puoi farlo nella riga di comando usando ncat
nc
o socat
per associare un processo Python a un semplice socket. Oppure scrivi una semplice applicazione Python che si lega alla porta e ascolta i comandi da interpretare su un socket.
le prese possono essere locali e non esposte a nessuna interfaccia web.
Il problema è che se si avvia python
dalla riga di comando, in genere è collegato alla shell che è collegata a un terminale, infatti possiamo vedere
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
quindi quando scrivi a stdin
di Python, stai effettivamente scrivendo sul pty
psuedo-terminale, che è un dispositivo del kernel, non un semplice file. Esso utilizza ioctl
Non read
e write
, così potrete vedere l'uscita sullo schermo, ma non sarà inviato al processo generato ( python
)
Un modo per replicare quello che stai provando è 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
È inoltre possibile utilizzare screen
solo per l'input
# start screen
$ screen -dmS python python
# send command to input
$ screen -S python -X 'print \"hello\"'
# view output
$ screen -S python -x