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
nc
lub w socat
celu 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 python
z 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 stdin
Pythona, w rzeczywistości piszesz na pty
terminalu psuedo, który jest urządzeniem jądra, a nie prostym plikiem. Używa ioctl
nie read
i 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ą fifo
lub 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ć screen
tylko 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