Tôi đã viết một ứng dụng Python 3.5 bằng mô-đun cmd. Điều cuối cùng tôi muốn thực hiện là xử lý đúng đắn tín hiệu CTRL-C (sigint). Tôi muốn nó cư xử nhiều hay ít đường Bash làm nó:Xử lý CTRL-C trong mô-đun cmd Python
- in^C tại điểm con trỏ là
- rõ ràng bộ đệm để các văn bản đầu vào sẽ bị xóa
- Skip to tiếp theo dòng, in dấu nhắc, và chờ cho đầu vào
về cơ bản:
/test $ bla bla bla|
# user types CTRL-C
/test $ bla bla bla^C
/test $
đây được đơn giản hóa mã như một Runnable mẫu:
import cmd
import signal
class TestShell(cmd.Cmd):
def __init__(self):
super().__init__()
self.prompt = '$ '
signal.signal(signal.SIGINT, handler=self._ctrl_c_handler)
self._interrupted = False
def _ctrl_c_handler(self, signal, frame):
print('^C')
self._interrupted = True
def precmd(self, line):
if self._interrupted:
self._interrupted = False
return ''
if line == 'EOF':
return 'exit'
return line
def emptyline(self):
pass
def do_exit(self, line):
return True
TestShell().cmdloop()
Điều này gần như hoạt động. Khi tôi nhấn CTRL-C,^C được in tại con trỏ, nhưng tôi vẫn phải nhấn enter. Sau đó, phương thức precmd
thông báo cờ self._interrupted
do trình xử lý thiết lập và trả về một dòng trống. Điều này là xa như tôi có thể mang nó, nhưng tôi muốn bằng cách nào đó không phải nhấn mà nhập.
Tôi đoán bằng cách nào đó tôi cần buộc input()
trả lại, không ai có ý tưởng?
Nó sẽ giúp có một mẫu runnable nhỏ. Nếu không chạy mã của bạn như thế nào bạn hiện đang đi về nó, sẽ viết một ''\ n'' hoặc trống để' stdout' đủ? Đó là một khi xử lý tín hiệu bị vấp phải một dòng mới vào cuối ''^ C'' – tijko
@tijko Chỉnh sửa bài đăng bằng cách thay thế đoạn mã bằng một mẫu có thể chạy được. Tôi đã thử viết một dòng mới để stdout (nó thực sự được thực hiện theo mặc định bởi phương thức in), nhưng nó không hoạt động, và tại sao nó? Nó sẽ yêu cầu cho stdin được cho ăn từ stdout, mà không phải là trường hợp, nó không phải đường ống. – wujek
Vâng, bạn nói đúng Tôi đã không suy nghĩ về dấu nhắc lệnh dòng lệnh stdin. @DanGetz có câu trả lời phù hợp với nhu cầu của bạn mà tôi tin. Nó sạch hơn, không cần phải thiết lập xử lý tín hiệu hoặc thiết lập cờ. Sau khi bình luận của bạn tôi bắt đầu suy nghĩ dọc theo các dòng chuyển hướng stdin là tốt, bạn có thể điều chỉnh để tuy nhiên bạn cần. – tijko