本篇文章,主要介紹如何通過Python發送Ctrl + C的信號,中斷正在執行的任務。
案例故事: Android系統測試或App測試過程中,
可以考慮用adb shell screenrecord /sdcard/video.mp4 命令錄製屏幕視頻,
比如錄製某個Bug發生的整個過程,比用手機拍攝的視頻效果好很多,
當錄製完畢後,我們一般是通過Ctrl + C 來停止錄製,然後導出該錄屏文件,
其實我們可用Python腳本實現一鍵錄屏。
準備階段
- adb shell screenrecord /sdcard/video.mp4 可以錄製屏幕視頻。
- 由於以上錄製屏幕視頻的命令是一個持續輸出的命令,
它如果沒被中斷,會一直持續錄製下去,直到滿3分鐘, - os.system可以調用以上命令。
- 捕獲KeyboardInterrupt異常(即發送Ctrl + C中斷信號),中斷錄製任務。
Python批處理腳本形式
記住批處理腳本的精髓: 順序執行Python語句
import os
command = "adb shell screenrecord /sdcard/video.mp4"
try:
print("後臺錄屏中,您可以Ctrl + C隨時結束錄製!")
os.system(command) # 開始執行adb錄屏命令, 如果不做任何操作,默認最多錄製3分鐘(180秒)
except KeyboardInterrupt: # 隨時接收Ctrl + C的信號
os.system("adb pull /sdcard/video.mp4 .") # # 導出視頻文件來
print("錄製結束,錄屏文件導出到了: %s" % os.path.join(os.getcwd(), "video.mp4"))
os.system("pause")
Python面向過程函數形式
找到可以封裝成一個函數塊的小代碼塊兒, 用函數封裝起來.
函數的命名一般建議用"動詞", 所以我們命名爲: “record_screen”,
封裝好後, 用record_screen()函數調用即可。
# coding=utf-8
import os
def record_screen():
command = "adb shell screenrecord /sdcard/video.mp4"
try:
print("後臺錄屏中,您可以Ctrl + C隨時結束錄製!")
os.system(command) # 開始執行adb錄屏命令, 如果不做任何操作,默認最多錄製3分鐘(180秒)
except KeyboardInterrupt: # 隨時接收Ctrl + C的信號
os.system("adb pull /sdcard/video.mp4 .") # # 導出視頻文件來
print("錄製結束,錄屏文件導出到了: %s" % os.path.join(os.getcwd(), "video.mp4"))
record_screen()
os.system("pause")
Python面向對象形式
以"一切皆可歸類"的思想, 先抽象化出一個類來,
類名一般建議用"名詞", 所以我們命名爲"ScreenRecorder",
代表屏幕錄製器, 且一般要駝峯式(首字母大寫)來規範類的命名.
養成良好的類的初始化(init)的習慣,
初始化過程中, 可以pass(什麼都不做)
這個ScreenRecorder 類, 目前只需要一個錄屏的函數(動作功能)就足夠了,
函數的命名一般建議用"動詞", 所以我們命名爲: “record_screen” .
類是一個抽象的事物, 必須實例化成具體的對象後,
才能進行調用, 所以我們實例化並命名成了s_obj, 表明是一個對象.
實例化成具體對象後, 對象就可以調用record_screen這個函數了.
# coding=utf-8
import os
class ScreenRecorder():
def __init__(self):
self.command = "adb shell screenrecord /sdcard/video.mp4"
def record_screen(self):
try:
print("後臺錄屏中,您可以Ctrl + C隨時結束錄製!")
os.system(self.command) # 開始執行adb錄屏命令, 如果不做任何操作,默認最多錄製3分鐘(180秒)
except KeyboardInterrupt: # 隨時接收Ctrl + C的信號
os.system("adb pull /sdcard/video.mp4 .") # # 導出視頻文件來
print("錄製結束,錄屏文件導出到了: %s" % os.path.join(os.getcwd(), "video.mp4"))
if __name__ == '__main__':
s_obj = ScreenRecorder()
s_obj.record_screen()
os.system("pause")
代碼運行方式與效果
確保Android設備通過USB線與電腦連接了,adb設備有效連接,
以上代碼的3種實現形式都可以直接運行,比如保存爲screen_record.py並放在桌面,
建議python screen_record.py運行,當然也可以雙擊運行。
小提示:本來更科學的方法應該是用subprocess.Popen()類的send_signal(signal.CTRL_C_EVENT)函數來實現Ctrl + C,
但是發現並不能實現Ctrl + C信號,所以最終還是捕獲KeyboardInterrupt異常這種方式實現,
subprocess.Popen()類功能還是很強大的,後續案例還會介紹到。
更多更好的原創文章,請訪問官方網站:www.zipython.com
自拍教程(自動化測試Python教程,武散人編著)
原文鏈接:https://www.zipython.com/#/detail?id=04ecbd58cb304d0fa1c2034ccaa3260d
也可關注“武散人”微信訂閱號,隨時接受文章推送。