Tôi đang viết một chương trình hiển thị văn bản trên thiết bị đầu cuối bằng cách sử dụng Unix ít hơn (1). Đây là phần có liên quan:Đầu vào không thành công sau khi giết ít hơn (1) subprocess
less = subprocess.Popen(['less -F -'], stdin=subprocess.PIPE,
stdout=sys.stdout, shell=True)
try:
less.stdin.write(rfc_text)
less.stdin.flush()
less.stdin = sys.stdin
less.wait()
except IOError:
less.terminate()
return errno.EPIPE
except KeyboardInterrupt:
less.terminate()
return 0
Trong khi chờ đợi ít hơn để kết thúc, tôi lắng nghe ngoại lệ cho bàn phím. Nếu tôi bắt được một, tôi sẽ giảm ít hơn với tín hiệu SIGTERM và thoát khỏi chương trình của tôi.
Bây giờ, khi điều đó xảy ra, tôi sẽ trở về dấu nhắc trình bao, nhưng trình bao không còn lặp lại những gì tôi viết và tôi phải đặt lại (1) để làm cho nó hoạt động trở lại.
Bất kỳ ý tưởng nào về cách làm cho ít chết hơn mà không dùng stdin của tôi với nó vào mộ? Toàn bộ nguồn có sẵn trên https://github.com/jforberg/rfc/blob/master/rfc.py
EDIT: Sau khi thử nghiệm, tôi đã phát hiện ra rằng cả mặc định (1) và man (1) đều bỏ qua đột quỵ C. Vì vậy, chỉ cần bỏ qua nó có thể là một lựa chọn khả thi. Tôi không chắc tôi nghĩ đó là cách thích hợp để làm điều đó mặc dù, vì vậy nếu ai đó có đề xuất tôi vẫn còn rất nhiều quan tâm.
Là giải pháp thay thế rẻ, bạn có thể đặt 'os.system ('reset')' vào cuối tập lệnh. Các giải pháp thích hợp có thể sẽ liên quan đến việc ngăn chặn 'ít' lịch sự hơn, tức là viết một sigint và 'q' thành stdin của nó và sau đó chờ đợi nó hoàn thành. – wim
@wim lại "giải pháp thích hợp của bạn": Tất nhiên! Ý nghĩ viết 'q' cho bản thân mình ít hơn đã không xảy ra với tôi. Ngay cả sau một thời gian lập trình Linux, tôi vẫn phải được nhắc nhở rằng mọi thứ đều là một tập tin. Hãy di chuyển nó vào một câu trả lời, và tôi sẽ chấp nhận nó. – jforberg
Vì không có thủ thuật 'setpgid',' less' phải nằm trong cùng một nhóm tiến trình với quy trình Python của bạn, vì vậy nó sẽ nhận được cùng^C như quy trình Python của bạn.Tôi cho rằng nó cố gắng xử lý đặc biệt của riêng mình, mặc dù ... Làm thế nào về việc sử dụng '-e' (' --quit-at-eof') để nó sẽ thoát ra sau khi chương trình của bạn bị treo? – ephemient