Das Senden von Eingaben an Shells / Dolmetscher auf diese Weise ist sehr problemanfällig und es ist sehr schwierig, zuverlässig zu arbeiten.
Der richtige Weg ist die Verwendung von Sockets. Aus diesem Grund wurden sie erfunden. Sie können dies in der Befehlszeile tun ncat
nc
oder socat
einen Python-Prozess an einen einfachen Socket binden. Oder schreiben Sie eine einfache Python-Anwendung, die an den Port bindet und auf Befehle wartet, die auf einem Socket interpretiert werden sollen.
Sockets können lokal sein und dürfen keiner Weboberfläche ausgesetzt sein.
Das Problem ist, dass, wenn Sie python
von der Befehlszeile aus starten , diese normalerweise an Ihre Shell angehängt wird, die an ein Terminal angeschlossen ist. Tatsächlich können wir sehen
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
Wenn Sie also in stdin
Python schreiben, schreiben Sie tatsächlich in das pty
Pseudo-Terminal, bei dem es sich um ein Kernel-Gerät handelt, nicht um eine einfache Datei. Es verwendet ioctl
nicht read
und write
, so dass Sie die Ausgabe auf Ihrem Bildschirm sehen, aber es wird nicht an den erzeugten Prozess gesendet ( python
)
Eine Möglichkeit, das, was Sie versuchen, zu replizieren, ist ein fifo
oder 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
Sie können auch screen
nur zur Eingabe verwenden
# start screen
$ screen -dmS python python
# send command to input
$ screen -S python -X 'print \"hello\"'
# view output
$ screen -S python -x