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 ncoder socateinen 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 pythonvon 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 stdinPython schreiben, schreiben Sie tatsächlich in das ptyPseudo-Terminal, bei dem es sich um ein Kernel-Gerät handelt, nicht um eine einfache Datei. Es verwendet ioctlnicht readund 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 fifooder 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 screennur 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