Отправка входных данных оболочкам / интерпретаторам таким образом очень проблематична и очень трудно заставить работать любым надежным способом.
Правильным способом является использование сокетов, поэтому они были изобретены, вы можете сделать это в командной строке, используя 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