이런 식으로 쉘 / 인터프리터에 입력을 보내는 것은 문제가 발생하기 쉽고 신뢰할 수있는 방식으로 작업하기가 매우 어렵습니다.
올바른 방법은 소켓을 사용하는 것입니다. 이것이 소켓이 발명 된 이유입니다. 명령 행에서 ncat
nc
또는 socat
파이썬 프로세스를 간단한 소켓에 바인드하여 바인딩 할 수 있습니다 . 또는 포트에 바인딩하고 소켓에서 해석하는 명령을 수신하는 간단한 Python 애플리케이션을 작성하십시오.
소켓은 로컬 일 수 있으며 웹 인터페이스에 노출되지 않습니다.
문제 는 python
명령 줄에서 시작하면 일반적으로 터미널에 연결된 셸에 연결되어 실제로 볼 수 있다는 것입니다
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
stdin
파이썬으로 쓸 때 실제로 pty
는 단순한 파일이 아니라 커널 장치 인 의사 터미널에 쓰는 것 입니다. ioctl
not 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