近年来“自动编程”、“智能编程”方面的项目层出不穷,例如AutoML、kite,以及最近风靡一时的python_autocomplete,这些项目有一个共同点,就是基于机器学习模型,致力于提升代码补全和自动生成水平。

不过今天要展示的自动编程与上述概念不同,这次我们不讲学术、不论实用,抱着娱乐的心态体验一把另类的“全自动编程”模式。

01.项目介绍

今天要介绍的这个库的名字叫pynput,与人工智能无关,这是一个控制和监控计算机输入设备的库,这是他的GitHub地址(详细见文末),从库的简介中可以看到,目前仅支持鼠标和键盘两种基本的输入设备。

接下来我们打开文档,看看pynput究竟有哪些功能。从文档目录(下图)来看,关于pynput的说明大体分为三个部分:分别是鼠标事件、键盘事件和平台限制。

先来简单说一下平台限制,因为事关外部输入设备,在不同的操作系统中肯定会有一些差异和功能限制,例如Linux下需要设置环境变量$ DISPLAY、MAC操作系统限制了对键盘的监控、Windows中进程间的虚拟事件传递可能受限等等。

总的来说,平台限制并不影响基本的使用(特别是在Windows系统中),我们暂且放下不谈。

接着我们重点聊一聊鼠标事件和键盘事件。先来说鼠标事件部分,pynput对鼠标事件的处理主要分为控制和监控两大部分。
在鼠标控制部分,可以通过代码模拟鼠标的移动、单击、双击、滚轮等操作,下面这张图就是文档中的演示代码,函数名称和实际事件名基本一致,很容易理解。

在鼠标事件的监控部分,监控任务Listener实际上是一个threading.Thread对象,采用回调函数的方式实时监控鼠标行为(下图是文档中的演示代码)。既然是threading.Thread对象,Listener当然也就有阻塞和非阻塞两种模式,一般来说,如果想要监控物理鼠标的行为,使用阻塞模式比较合适,如果想要监控pynput的模拟鼠标操作,建议采用非阻塞模式。

再来看键盘事件部分,和鼠标事件类似,pynput对键盘事件的处理也是分为控制和监控两大部分,函数结构和操作模式也跟鼠标事件基本相同,这里就不展示文档中的演示代码了。有一点需要注意的是,键盘操作中有一些特殊方法,比如“ctrl+”、‘“shift+”、“alt+”这类的组合键,还有F1~FN、backspace、delete、insert等特殊功能键,在pynput中都有专门的定义,在操作时可以直接使用。

02.功能演示

介绍完基本功能,我们就写一段代码试一试pynput的设备控制以及监控效果,由于上文中重点介绍了关于鼠标事件的处理,这里就以键盘事件处理为例进行演示。

我们设计这样一个程序:

  • 主线程:随机生成20个(准确地说是19个)小写英文字母,并用pynput模拟键盘输入,在第10个字母输入后附加输入一个退格键(backspace)。
  • 监控线程:对键盘的按键和松开两种操作进行监控,同时在控制台输出相关信息,当遇到退格键(backspace)松开这一事件时,终止监控线程。

为了便于观察,在每个随机字符串输入后加入一个0.5s的时间间隔,另外由于这里是要监控虚拟的键盘按键事件,因此监控线程使用非阻塞模式,代码如下:

一起来看下这段代码的动态执行情况,在下面这段动画中字符(包括退格键)的输入全部都是基于pynput自动实现的。

通过上面这个动画可以看到,在程序运行的前半部分,输入结果和监控结果是完全一致的,直到退格键(backspace)事件发生后,控制台就不再输出监控信息,这是因为监控线程已经被终止掉了,但是模拟键盘输入仍然会继续,直到指定数量的字符串全部输入完毕为止。通过这个例子应该就能很好地理解pynput的监控线程了,有兴趣的朋友不妨自己体会一下。

至于鼠标事件的控制、监控功能,因为和键盘事件十分类似,这里就不再重复演示了。另外,由于鼠标没有键盘中那么多复杂的、各式各样的功能键,从某种意义上说鼠标事件的处理要比键盘事件处理更简单一些。

03.神奇的"自动编程"

最后,我们回到今天的主题,把鼠标事件和键盘事件的控制结合起来,实现一个“全自动编程”的功能。事实上这里实现的“自动编程”与人工智能无关,也不是传统的代码匹配补全,而是控制鼠标和键盘按照我们提前设置好的步骤自动运行。

为了方便,我们就用最简单的“Hello World”来进行演示,在sublime中完成“Hello World”程序大概需要经过以下几个步骤:新建一个sublime文件——命名、保存为py文件——在新建的py文件中输入“print(‘Hello World’)”语句——再次保存——运行新的程序。

前文讲到过,pynput可以模拟所有的鼠标和键盘操作,上面步骤中的操作自然也可以由pynput模拟完成,就跟手动操作一样。我们把以上操作全部写到脚本中,同时加入鼠标和键盘的监控线程,在脚本启动后不仅会自动编写运行“Hello World”程序,还会对鼠标和键盘的模拟操作进行实时监控,并将相关信息输出到控制台。

先来看结果,下面这个动画就是我们写的“自动编程”脚本的运行情况,整个过程全部自动执行,没有任何手动干预。

在整个过程中,所有的鼠标和键盘事件都会被监控线程记录,包括每一次键盘按键的点击和释放、鼠标的移动和点击等。

下面我们来看看这个脚本的核心代码,可以看到,我们使用pynput模拟了所有与鼠标和键盘有关的操作,使用这种方法还可以编写更加复杂的程序,只需要改变keycontroller.type的输入内容就可以。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
keycontroller = keyboard.Controller()
mousecontroller = mouse.Controller()
# 新建文件
keycontroller.press(keyboard.Key.ctrl_l)
keycontroller.press('n')
keycontroller.release(keyboard.Key.ctrl_l)
keycontroller.release('n')
sleep(1)
# 保存文件
keycontroller.press(keyboard.Key.ctrl_l)
keycontroller.press('s')
keycontroller.release(keyboard.Key.ctrl_l)
keycontroller.release('s')
sleep(1)
# 输入文件名称
keycontroller.type('auto{}.py'.format(random.uniform(0,99)))
sleep(1)
# 点击保存
mousecontroller.position = (0, 0)
mousecontroller.move(466, 493)
mousecontroller.press(mouse.Button.left)
mousecontroller.release(mouse.Button.left)
sleep(1)
# 输入代码
keycontroller.type("print('Hello World')")
keycontroller.press(keyboard.Key.space)
sleep(1)
# 重新保存
keycontroller.press(keyboard.Key.ctrl_l)
keycontroller.press('s')
keycontroller.release(keyboard.Key.ctrl_l)
keycontroller.release('s')
sleep(1)
# 运行新程序
keycontroller.press(keyboard.Key.ctrl_l)
keycontroller.press('b')
keycontroller.release(keyboard.Key.ctrl_l)
keycontroller.release('b')

友情提示:

正如本文开头所说,使用pynput实现的所谓“自动编程”仅仅是一种娱乐,并没有太多实用价值。但是pynput对于输入设备的控制和监控在实践中倒是有可能会用得上,至于如何发挥他的作用,就要看自己的想象力了。

Python真神奇,带你体验另类的“全自动编程”相关推荐

  1. python控制台动画_Python真神奇,带你体验另类的“全自动编程”

    近年来"自动编程"."智能编程"方面的项目层出不穷,例如AutoML.kite,以及最近风靡一时的python_autocomplete,这些项目有一个共同点, ...

  2. 五分钟学会python函数_Python——带你五分钟了解函数式编程与闭包

    今天是Python专题的第9篇文章,咱们来聊聊Python的函数式编程与闭包.编程 函数式编程 函数式编程这个概念咱们可能或多或少都据说过,刚据说的时候不明觉厉,以为这是一个很是黑科技的概念.可是实际 ...

  3. 免费直播:1小时带你体验Python车牌识别实战

    Python基础学会了,实战又是爬虫?太枯燥? 别无聊,CSDN学院邀请章秀淞老师开设技术直播课:1小时带你体验车牌识别实战.让你从众多车中,能用Python技术找到夏树上的那辆叔叔的奔驰车牌(玩笑) ...

  4. 免费直播:1 小时带你体验 Python 车牌识别实战

    Python基础学会了,实战又是爬虫?太枯燥? 别无聊,CSDN学院邀请章秀淞老师开设技术直播课:1小时带你体验车牌识别实战.让你从众多车中,能用Python技术找到夏树上的那辆叔叔的奔驰车牌(玩笑) ...

  5. 鸿蒙天钟壁纸,AI加持的另类彩电之华为智慧屏带你体验鸿蒙

    原标题:AI加持的另类彩电之华为智慧屏带你体验鸿蒙 [前言] 尽管电视机作为家中常备电器许多年,但并没有太大的波澜,似乎一直都被几家家电巨头垄断,同时也并没有太大的创新和亮点.而这次华为推出智慧屏,形 ...

  6. pythoncookie自动模拟登录_用Python模拟技巧带你实现自动抽屉登录自动点赞

    原标题:用Python模拟技巧带你实现自动抽屉登录&自动点赞 /1 前言/ 嘿,各位小伙伴们晚上好呀,今天小编又给大家带来干货内容啦,今天带来的是,如何自动登录抽屉,并且点赞! 原计划是不打算 ...

  7. python自动化办公入门书籍-Python如此神奇,让繁琐工作自动化 (文中含Python基础)...

    原标题:Python如此神奇,让繁琐工作自动化 (文中含Python基础) "你在2个小时里完成的事,我们3个人要做两天."21世纪早期,我的大学室友在一个电子产品零售商店工作.商 ...

  8. 我们编写的python代码在运行过程中_在Rust代码中编写Python是种怎样的体验?

    原标题:在Rust代码中编写Python是种怎样的体验? 作者 | Mara Bos,Rust资深工程师 译者 | Arvin,编辑 | 屠敏 来源 | CSDN(ID:CSDNnews) 大约一年前 ...

  9. Python 的神奇方法指南

    简介 有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling). 你可以把它当作一 ...

最新文章

  1. python3自动释放线程_Python3高级特性:并发
  2. 使用com.sun.imageio.plugins.png.PNGMetadata读取图片的元数据
  3. python的lambda函数_Python-Lambda函数的范围及其参数?
  4. java父类转换成子类_【转】java 父类与子类的转换
  5. PHP浏览器中的data类型的Url格式,data:image/png
  6. 如何将React App转换为React Native
  7. 2008秋季-计算机软件基础-未交实验报告名单
  8. 【解决】jupyter在deepin安装上的坑
  9. 为对抗训练的理论工作添砖加瓦:选择核心子集进行训练,大大缩短训练时间...
  10. windows资源监控
  11. LeetCode-326. Power of Three
  12. Linux下的压缩和解压缩命令——compress/uncompress
  13. Android 功能系列篇
  14. uva 1329(加权并查集)
  15. 利用vertical-align:middle实现在整个页面居中
  16. Linux统计文件夹下文件数量
  17. 医疗管理系统HIS源码
  18. Retina 显示屏
  19. java 循环依赖_Java详解之Spring Bean的循环依赖解决方案
  20. Fluent瞬态结果导出为Ensight格式

热门文章

  1. hibernate 模糊查询及not in子查询
  2. Scala---For语句段
  3. Outlook 获取联系人名片对象为空
  4. Visual Studio中的Build和Rebuild区别
  5. Brocade说:网络就是云
  6. 配置ORACLE 客户端连接到数据库
  7. “影响100活动”答记者问(二)
  8. python的tkinter编写计算器_Python+Tkinter 实现计算器功能
  9. Oracle连接查询
  10. 如何删除开发用户的开发Key