Python真神奇,带你体验另类的“全自动编程”
近年來“自動編程”、“智能編程”方面的項目層出不窮,例如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真神奇,带你体验另类的“全自动编程”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 中的高级斗技,让函数返回结
- 下一篇: Python中有用的字符串方法