南宁网站建公司电话,漳州做网站优化,网站论坛推广文案怎么做,横琴建设局网站我发现了一些使用Ctrl-C实现所需行为的hacky方法.设置use_rawinput False并替换stdin这个(或多或少……)粘在cmd.Cmd的公共接口上.不幸的是,它禁用了readline支持.您可以将use_rawinput设置为false并传递一个不同的类文件对象来替换Cmd .__ init __()中的stdin.实际上,只在此对…我发现了一些使用Ctrl-C实现所需行为的hacky方法.设置use_rawinput False并替换stdin这个(或多或少……)粘在cmd.Cmd的公共接口上.不幸的是,它禁用了readline支持.您可以将use_rawinput设置为false并传递一个不同的类文件对象来替换Cmd .__ init __()中的stdin.实际上,只在此对象上调用readline().因此,您可以为stdin创建一个包装器,捕获KeyboardInterrupt并执行您想要的行为class _Wrapper:def __init__(self,fd):self.fd fddef readline(self,*args):try:return self.fd.readline(*args)except KeyboardInterrupt:print()return \nclass TestShell(cmd.Cmd):def __init__(self):super().__init__(stdin_Wrapper(sys.stdin))self.use_rawinput Falseself.prompt $def precmd(self,line):if line EOF:return exitreturn linedef emptyline(self):passdef do_exit(self,line):return TrueTestShell().cmdloop()当我在终端上运行它时,Ctrl-C显示^ C并切换到新行.猴子补丁输入()如果你想要input()的结果,除了你想要Ctrl-C的不同行为,一种方法是使用不同的函数而不是input()def my_input(*args): # input() takes either no args or one non-keyword argtry:return input(*args)except KeyboardInterrupt:print(^C) # on my system,input() doesnt show the ^Creturn \n但是,如果您只是盲目地设置input my_input,则会得到无限递归,因为my_input()将调用input(),现在它本身就是.但这是可以修复的,你可以在cmd模块中修补__builtins__字典,以便在Cmd.cmdloop()期间使用修改后的input()方法def input_swallowing_interrupt(_input):def _input_swallowing_interrupt(*args):try:return _input(*args)except KeyboardInterrupt:print(^C)return \nreturn _input_swallowing_interruptclass TestShell(cmd.Cmd):def cmdloop(self,*args,**kwargs):old_input_fn cmd.__builtins__[input]cmd.__builtins__[input] input_swallowing_interrupt(old_input_fn)try:super().cmdloop(*args,**kwargs)finally:cmd.__builtins__[input] old_input_fn# ...请注意,这会更改所有Cmd对象的input(),而不仅仅是TestShell对象.如果这是你不能接受的,你可以……复制Cmd.cmdloop()源并进行修改由于你是子类化它,你可以让cmdloop()做你想做的任何事情. “你想要的任何东西”可能包括复制Cmd.cmdloop()的部分并重写其他部分.通过调用另一个函数替换对input()的调用,或者在重写的cmdloop()中捕获并处理KeyboardInterrupt.如果您害怕使用新版本的Python更改底层实现,您可以将整个cmd模块复制到一个新模块中,并更改您想要的内容.