Таким чином, надсилання даних до оболонок / перекладачів є дуже схильною до проблем та дуже важко працювати будь-яким надійним способом.
Правильний спосіб - це використовувати сокети, тому вони були винайдені, ви можете це зробити в командному рядку, використовуючи ncat
nc
або socat
прив’язуючи процес python до простого сокета. Або напишіть просту програму python, яка прив’язується до порту та слухає команди для інтерпретації на сокет.
розетки можуть бути локальними та не піддаватися впливу будь-якого веб-інтерфейсу.
Проблема полягає в тому, що якщо ви починаєте python
з командного рядка, він, як правило, прикріплюється до оболонки, яка приєднана до терміналу, насправді ми можемо бачити
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
тому, коли ви пишете в stdin
python, ви насправді пишете на pty
psuedo-термінал, який є пристроєм ядра, а не простим файлом. Він використовує ioctl
не read
та write
, тож ви побачите вихід на екрані, але він не буде надісланий до спареного процесу ( python
)
Один із способів повторити те, що ви намагаєтесь, це за допомогою fifo
або 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
Ви також можете використовувати screen
лише для введення даних
# start screen
$ screen -dmS python python
# send command to input
$ screen -S python -X 'print \"hello\"'
# view output
$ screen -S python -x