Таким чином, надсилання даних до оболонок / перекладачів є дуже схильною до проблем та дуже важко працювати будь-яким надійним способом.
Правильний спосіб - це використовувати сокети, тому вони були винайдені, ви можете це зробити в командному рядку, використовуючи ncat ncабо socatприв’язуючи процес python до простого сокета. Або напишіть просту програму python, яка прив’язується до порту та слухає команди для інтерпретації на сокет.
розетки можуть бути локальними та не піддаватися впливу будь-якого веб-інтерфейсу.
Проблема полягає в тому, що якщо ви починаєте pythonз командного рядка, він, як правило, прикріплюється до оболонки, яка приєднана до терміналу, насправді ми можемо бачити
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
тому, коли ви пишете в stdinpython, ви насправді пишете на ptypsuedo-термінал, який є пристроєм ядра, а не простим файлом. Він використовує 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