Przesyłanie danych wejściowych do powłok / tłumaczy w ten sposób jest bardzo podatne na problemy i bardzo trudno jest uzyskać niezawodne działanie.
Właściwym sposobem jest użycie gniazd, dlatego zostały one wynalezione, możesz to zrobić w wierszu poleceń, używając ncat nclub w socatcelu powiązania procesu Pythona z prostym gniazdem. Lub napisz prostą aplikację pythonową, która łączy się z portem i nasłuchuje poleceń interpretowanych na gnieździe.
gniazda mogą być lokalne i nie mogą być narażone na żaden interfejs WWW.
Problem polega na tym, że jeśli zaczynasz pythonz wiersza poleceń, zwykle jest on dołączony do powłoki, która jest podłączona do terminala, w rzeczywistości możemy zobaczyć
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
więc kiedy piszesz do stdinPythona, w rzeczywistości piszesz na ptyterminalu psuedo, który jest urządzeniem jądra, a nie prostym plikiem. Używa ioctlnie readi write, więc zobaczysz wynik na ekranie, ale nie zostanie wysłany do odrodzonego procesu ( python)
Jednym ze sposobów replikacji tego, co próbujesz, jest za pomocą fifolub 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
Możesz także użyć screentylko do wprowadzania danych
# start screen
$ screen -dmS python python
# send command to input
$ screen -S python -X 'print \"hello\"'
# view output
$ screen -S python -x