Gửi đầu vào cho shell / trình thông dịch theo cách này rất dễ gặp vấn đề và rất khó để làm việc theo bất kỳ cách đáng tin cậy nào.
Cách thích hợp là sử dụng socket, đây là lý do tại sao chúng được phát minh, bạn có thể thực hiện điều này trong dòng lệnh bằng cách sử dụng ncat
nc
hoặc socat
liên kết một quá trình python với một socket đơn giản. Hoặc viết một ứng dụng python đơn giản liên kết với cổng và lắng nghe các lệnh để diễn giải trên một socket.
ổ cắm có thể là cục bộ và không tiếp xúc với bất kỳ giao diện web.
Vấn đề là nếu bạn bắt đầu python
từ dòng lệnh, nó thường được gắn vào vỏ của bạn được gắn vào một thiết bị đầu cuối, trên thực tế chúng ta có thể thấy
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
Vì vậy, khi bạn viết thư cho stdin
python, bạn thực sự đang ghi vào pty
thiết bị đầu cuối psuedo, đây là một thiết bị kernel, không phải là một tệp đơn giản. Nó ioctl
không sử dụng read
và write
vì vậy bạn sẽ thấy đầu ra trên màn hình của mình, nhưng nó sẽ không được gửi đến quá trình sinh ra ( python
)
Một cách để tái tạo những gì bạn đang cố gắng là với một fifo
hoặc 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
Bạn cũng chỉ có thể sử dụng screen
cho đầu vào
# start screen
$ screen -dmS python python
# send command to input
$ screen -S python -X 'print \"hello\"'
# view output
$ screen -S python -x