这个脚本在启动app进行左右划简单操作时,启动两个线程同时获取CPU和内存使用情况,然后要把得到的数据存放在本地CSV文件中。这就要使用到threading模块和CSV模块。
# -*- coding=utf-8 -*- import os import threading as trg import time import csv #启动app def start_app(): getcmd = os.popen('adb shell am start -W -n com.ss.android.article.video/.activity.MainActivity') # print(getcmd.read()) # print(type(getcmd)) for line in getcmd.readlines(): if 'ThisTime' in line: start_time = line.split(':')[1] # print(start_time) # print(type(start_time)) break savedata_to_csv(start_time, 'starttime.csv') #停止app def stop_app(): os.system('adb shell am force-stop com.ss.android.article.video') #获取CPU信息 def get_cpuinfo(): getcmd = os.popen('adb shell dumpsys cpuinfo|findstr com.ss.android.article.video').read() #print(getcmd) if 'com.ss.android.article.video'in getcmd: cpuinfo = getcmd.split('%')[0] # print(cpuinfo) # print(type(cpuinfo)) savedata_to_csv(cpuinfo, 'cpuinfo.csv') #向左划 def move_lafe(): os.system('adb shell input swipe 600 800 100 800 200') #向右划 def move_right(): os.system('adb shell input swipe 100 800 600 800 200') #获取内存信息 def get_meminfo(): getcmd = os.popen('adb shell dumpsys meminfo|findstr com.ss.android.article.video').read() #print(getcmd) # print(type(getcmd)) if 'com.ss.android.article.video' in getcmd: meminfo = getcmd.split(':')[0] # print(meminfo) # print(type(meminfo)) savedata_to_csv(meminfo, 'meminfo.csv') #保存数据到csv def savedata_to_csv(data,createcsv): csvfile = open(createcsv,'a', newline='\n') csv_writer = csv.writer(csvfile) csv_writer.writerow([data]) csvfile.close() #从这开始 if __name__ == '__main__': runtimes = input('Please Enter runtimes:') #确定运行次数 try: runtimes = int(runtimes)#检测输入是否为数字 while runtimes > 0:#运行 cpuget = trg.Thread(target=get_cpuinfo) memget = trg.Thread(target=get_meminfo) runtimes -= 1 print('%s times will be running ' % runtimes) start_app() time.sleep(9) move_lafe() time.sleep(0.5) move_right() cpuget.start() memget.start() memget.join() cpuget.join() stop_app() time.sleep(3) print('finish') except: print('Your enter is Err,pls enter number')
在使用过程中遇到问题:
1.使用csv储存时,出现一个字符占一个格子的情况。代码如下:
def savedata_to_csv(data,createcsv): csvfile = open(createcsv,'a', newline='\n') csv_writer = csv.writer(csvfile) csv_writer.writerow(data) csvfile.close()
解决方法:
在 csv_writer.writerow(data)的括号中给data加上[]变成[data]就能解决了
很坑爹的是在官方的docs中并没有相关的提示介绍。
writer(...) csv_writer = csv.writer(fileobj [, dialect='excel'] [optional keyword args]) for row in sequence: csv_writer.writerow(row) [or] csv_writer = csv.writer(fileobj [, dialect='excel'] [optional keyword args]) csv_writer.writerows(rows) The "fileobj" argument can be any object that supports the file API.
这个教训告诉我,查阅官方docs固然可以帮助了解function的用法。但是很多小窍门还是要多于人交流才能知道,不能闭门造车。
2.使用多线程时在运行两次之后出现 RuntimeError: threads can only be started once 报错。当时代码如下:
if __name__ == '__main__': runtimes = input('Please Enter runtimes:') #确定运行次数 cpuget = trg.Thread(target=get_cpuinfo) memget = trg.Thread(target=get_meminfo) try: runtimes = int(runtimes)#检测输入是否为数字 while runtimes > 0:#运行 runtimes -= 1 print('%s times will be running ' % runtimes) start_app() time.sleep(9) move_lafe() time.sleep(0.5) move_right() cpuget.start() memget.start() memget.join() cpuget.join() stop_app() time.sleep(3) print('finish') except: print('Your enter is Err,pls enter number')
解决方法:
把创建线程的对象的两句语句放在while循环里面,让它在每次循环中都创建新的对象。