Что означает «числовое» перенаправление в Linux?

Отправка входных данных оболочкам/интерпретаторам таким способом чревата -большими проблемами, и очень трудно заставить работать каким-либо надежным способом.

Правильным способом является использование сокетов, поэтому они были изобретены, вы можете сделать это в командной строке, используяncatncили 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
0
22.10.2019, 11:59
1 ответ

Это ссылки на ранее открытый файловый дескриптор.

См. этот пост в stackoverflow

1
28.01.2020, 02:39

Теги

Похожие вопросы