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

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

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




[h1]01.[/h1][h1]项目介绍[/h1]
今天要介绍的这个库的名字叫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的输入内容就可以
  1. keycontroller = keyboard.Controller()
  2. mousecontroller = mouse.Controller()
  3. # 新建文件
  4. keycontroller.press(keyboard.Key.ctrl_l)
  5. keycontroller.press('n')
  6. keycontroller.release(keyboard.Key.ctrl_l)
  7. keycontroller.release('n')
  8. sleep(1)
  9. # 保存文件
  10. keycontroller.press(keyboard.Key.ctrl_l)
  11. keycontroller.press('s')
  12. keycontroller.release(keyboard.Key.ctrl_l)
  13. keycontroller.release('s')
  14. sleep(1)
  15. # 输入文件名称
  16. keycontroller.type('auto{}.py'.format(random.uniform(0,99)))
  17. sleep(1)
  18. # 点击保存
  19. mousecontroller.position = (0, 0)
  20. mousecontroller.move(466, 493)
  21. mousecontroller.press(mouse.Button.left)
  22. mousecontroller.release(mouse.Button.left)
  23. sleep(1)
  24. # 输入代码
  25. keycontroller.type("print('Hello World')")
  26. keycontroller.press(keyboard.Key.space)
  27. sleep(1)
  28. # 重新保存
  29. keycontroller.press(keyboard.Key.ctrl_l)
  30. keycontroller.press('s')
  31. keycontroller.release(keyboard.Key.ctrl_l)
  32. keycontroller.release('s')
  33. sleep(1)
  34. # 运行新程序
  35. keycontroller.press(keyboard.Key.ctrl_l)
  36. keycontroller.press('b')
  37. keycontroller.release(keyboard.Key.ctrl_l)
  38. keycontroller.release('b')
复制代码
(代码可以左右滑动)

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

往期热门:
值得收藏|菜鸟学Python【入门文章大全】

学习群:
小密圈人气很高的两个实战项目
小密圈的趣味实战-微信主题
3个月还没入门Python,看这100名小密圈的同学3周学Python的杰作

游戏类:
太好玩了!用Python写个弹球游戏2.0
巧妙的Python数据结构玩法|实战德州扑克


赠书方法:
为了把书给更多真正玩Python的同学,这次送书我们设定了一个的门槛,回答出这道题目的同学,可以参与抽奖!

题目:
如果数字1到5用英语写出:one,two,three,four,five,则总共使用3 + 3 + 5 + 4 + 4 = 19个字母。如果所有1到1001(包含一千零一)的数字都用英语写出来,会用多少个字母?

答案是数字,大家把答案写出来,写在公众号后面,答对的即可抽奖!

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:160
帖子:32
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP