python c cmd_在Python cmd模块中处理CTRL-C

我发现了一些使用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 = fd

def readline(self,*args):

try:

return self.fd.readline(*args)

except KeyboardInterrupt:

print()

return '\n'

class TestShell(cmd.Cmd):

def __init__(self):

super().__init__(stdin=_Wrapper(sys.stdin))

self.use_rawinput = False

self.prompt = '$'

def precmd(self,line):

if line == 'EOF':

return 'exit'

return line

def emptyline(self):

pass

def do_exit(self,line):

return True

TestShell().cmdloop()

当我在终端上运行它时,Ctrl-C显示^ C并切换到新行.

猴子补丁输入()

如果你想要input()的结果,除了你想要Ctrl-C的不同行为,一种方法是使用不同的函数而不是input():

def my_input(*args): # input() takes either no args or one non-keyword arg

try:

return input(*args)

except KeyboardInterrupt:

print('^C') # on my system,input() doesn't show the ^C

return '\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 '\n'

return _input_swallowing_interrupt

class 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模块复制到一个新模块中,并更改您想要的内容.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] 列举几种瀑布流布局的方法

[html] 列举几种瀑布流布局的方法 flex方法: .waterfall{ //从上到下 display: flex; flex-direction: row; } .column { //从左到右 display: flex; flex-direction: column; width: calc(100%/3); }个人简介 我是歌谣,欢迎和大家一起交流前后端知识。…

Activity、BroadcastReceiver、Service共同工作的简单例子

? Activity 好像是應用程式的眼睛,提供與User 互動之窗。 ? BroadcastReceiver 好像是耳朵,接收來自各方的Intent。 ? Service 好像是手,提供符合Intent 意圖之服務。 10.2.1 操作情境: 1. 此程式一開始,畫面出現兩…

linuxpython拍照_linux下python抓屏实现方法 -电脑资料

作者:zevolo 字体:[增加 减小] 类型:转载这篇文章主要介绍了linux下python抓屏实现方法,涉及Python操作屏幕截取的相关技巧,需要的朋友可以参考下本文实例讲述了linux下python抓屏实现方法,#!/usr/bin/python‘‘‘by zevolo, 201…

[html] 什么是表单域?它有哪些运用场景?

[html] 什么是表单域&#xff1f;它有哪些运用场景&#xff1f; <form></form>标签中间的部分 当点击这个表单域中的submit按钮&#xff0c;就会把表单中的数据提交到你action的属性指定的网页里面个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放…

线程执行一半断了_有的线程它死了,于是它变成一道面试题

----本文首发于公众号&#xff0c;关注文末公众号阅读体验更佳有些线程它活着&#xff0c;但它躺在池中碌碌无为&#xff1b;有的线程它死了&#xff0c;于是它变成一道面试题。这次的文章&#xff0c;要从一次阿里的面试说起。我记得那天是周一&#xff0c;刚刚经历过周末过的…

C#中的扩展方法,Linq,IO和多线程的定义和实例

前段时间学C#的上转型&#xff0c;泛型&#xff0c;lambda表达式这些应用的理解很费劲。学过之后我多多的练习了几天&#xff0c;接下来继续复习C#的其他一些概念&#xff0c;说实在的这些知识点学过之后很容易忘&#xff0c;但是都是很重要的&#xff0c;所以发表在博客上没事…

准确率 召回率_吴恩达深度学习笔记(61)-训练调参中的准确率和召回率

单一数字评估指标(Single number evaluation metric)无论你是调整超参数&#xff0c;或者是尝试不同的学习算法&#xff0c;或者在搭建机器学习系统时尝试不同手段&#xff0c;你会发现&#xff0c;如果你有一个单实数评估指标&#xff0c;你的进展会快得多&#xff0c;它可以快…

CDU集训代码:基础算法和数据结构2

做题地址&#xff1a; http://acm.hdu.edu.cn/diy/contest_login.php?cid16636 Problem A: HDU1040 排序题&#xff0c;可以直接使用c提供的排序&#xff0c;如果是JAVA&#xff0c;也可以使用自带的排序方法。C语言需要自己写排序算法。 #include<cstdio> #include<…

[html] 如何禁止input输入的历史记录

[html] 如何禁止input输入的历史记录 给form加上 autocompleteoff 可以禁止整个表单的历史记录给单个input加上 autocompleteoff 可禁止这个input的历史记录个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起…

python迷宫最短路径_python实现最短路径的实例方法

解决最短路径问题&#xff1a;(如下三种算法)(1)迪杰斯特拉算法(Dijkstra算法)(2)弗洛伊德算法(Floyd算法)(3)SPFA算法第一种算法&#xff1a;Dijkstra算法广度优先搜索解决赋权有向图或者无向图的单源最短路径问题.是一种贪心的策略算法的思路声明一个数组dis来保存源点到各个…

[html] html如何创建图片热区(img usemap)?

[html] html如何创建图片热区&#xff08;img usemap&#xff09;&#xff1f; <img src"china.gif" usemap"#mymap"><map name"mymap"><area shape"rect" href"a.html" coords"0,0,50,50"><…

探讨LoadRunner的并发用户和集合点

探讨LoadRunner的并发用户和集合点 近来跟踪一个项目&#xff0c;发现同事们在执行性能测试时&#xff0c;比较热衷于使用集合点&#xff0c;从概念上认为要得到并发用户就必须设置集合点&#xff0c;认为在执行一个压力测试脚本时&#xff0c;设置了集合点才算是有效的并发用…

python在职场的用处大吗_Python未来发展怎么样,未来办公是否都需要精通Python?...

首先&#xff0c;要先了解Python是什么&#xff1f;Python是一种计算机程序设计语言&#xff0c;又被称为胶水语言&#xff0c;可以用混合编译的方式使用c/c/java等语言的库。你可能已经听说过很多种流行的编程语言&#xff0c;比如在大学里感觉非常难学的C语言&#xff0c;进入…

spring gateway 鉴权_通过spring实现service变成controller,代码得到了简化

在网上发现了一个牛X的思路&#xff0c;在做restful的时候&#xff0c;如果业务改变&#xff0c;需要每次都修改controller&#xff0c;后来方便了&#xff0c;直接透传的方式&#xff0c;其实也比较麻烦&#xff0c;每次都要写controller。需求变了接口也发生了改变&#xff0…

java中return返回值_Java中return的用法

展开全部一、return语句总是用在方法中&#xff0c;有两个作用。一个是返回方法指定类型的值(这个值总62616964757a686964616fe59b9ee7ad9431333366306434是确定的)。一个是结束方法的执行(仅仅一个return语句)。二、实例1 。返回一个String。private String gets(){String s …

Magento 模块详解

模块&#xff08;module&#xff09;是Magento的核心。站点上的任何 一个动作&#xff08;action&#xff09;&#xff0c;无论是在前台和还是在后台的每一个操作都是通过模块来实现的。模块是可以视为一个容器&#xff0c;它可包 含下面这几项&#xff1a;设置(settings)&…

python运行别人的项目_pycharm实现在虚拟环境中引入别人的项目

如果你想引入别人的项目&#xff0c;但是呢引入的项目可能与自己原先装的模块的版本产生冲突&#xff0c;而且如果引入一个项目就在本地进行运行使用&#xff0c;每个项目用的依赖包都不大相同&#xff0c;就会导致解释器安装包过多&#xff0c;就会导致加载过慢&#xff0c;甚…

java 事件分发线程_深入浅出Java多线程(2)-Swing中的EDT(事件分发线程) [转载]...

本系列文章导航本文主要解决的问题是&#xff1a;如何使其Swing程序只能运行一个实例&#xff1f;抛开Swing&#xff0c; 我们的程序是通过java 命令行启动一个进程来执行的&#xff0c;该问题也就是说要保证这个进程的唯一性&#xff0c;当然如果能够访问系统的接口&#xff0…