L'envoi d' entrées aux shells / interprètes de cette manière est très sujet aux problèmes et très difficile à obtenir de manière fiable.
La bonne façon est d'utiliser des sockets, c'est pourquoi ils ont été inventés, vous pouvez le faire en ligne de commande en utilisant ncat
nc
ou socat
pour lier un processus python à une simple socket. Ou écrivez une application python simple qui se lie au port et écoute les commandes à interpréter sur un socket.
les sockets peuvent être locales et ne sont exposées à aucune interface Web.
Le problème est que si vous démarrez à python
partir de la ligne de commande, il est généralement attaché à votre shell qui est attaché à un terminal, en fait, nous pouvons voir
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
donc quand vous écrivez sur stdin
python, vous écrivez en fait sur le pty
psuedo-terminal, qui est un périphérique noyau, pas un simple fichier. Il n'utilise ioctl
pas read
et write
, vous verrez donc la sortie sur votre écran, mais il ne sera pas envoyé au processus généré ( python
)
Une façon de reproduire ce que vous essayez est d'utiliser un fifo
ou 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
Vous pouvez également utiliser screen
pour la saisie uniquement
# start screen
$ screen -dmS python python
# send command to input
$ screen -S python -X 'print \"hello\"'
# view output
$ screen -S python -x