Mengirim masukan ke shell / juru bahasa dengan cara ini sangat rawan masalah dan sangat sulit untuk bekerja dengan cara yang dapat diandalkan.
Cara yang tepat adalah dengan menggunakan soket, ini sebabnya mereka diciptakan, Anda dapat melakukan ini di command line menggunakan ncat
nc
atau socat
untuk mengikat proses python ke soket sederhana. Atau tulis aplikasi python sederhana yang mengikat ke port dan mendengarkan perintah untuk menafsirkan pada soket.
soket bisa lokal dan tidak terpapar ke antarmuka web apa pun.
Masalahnya adalah bahwa jika Anda mulai python
dari baris perintah, biasanya dilampirkan ke shell Anda yang terpasang ke terminal, pada kenyataannya kita bisa melihat
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
jadi ketika Anda menulis ke stdin
python, Anda sebenarnya menulis ke pty
terminal psuedo, yang merupakan perangkat kernel, bukan file sederhana. Ini menggunakan ioctl
tidak read
dan write
, jadi Anda akan melihat output di layar Anda, tetapi tidak akan dikirim ke proses spawned ( python
)
Salah satu cara untuk meniru apa yang Anda coba adalah dengan fifo
atau 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
Anda juga dapat menggunakan screen
input saja
# start screen
$ screen -dmS python python
# send command to input
$ screen -S python -X 'print \"hello\"'
# view output
$ screen -S python -x