py+adb 交互(0) --基础

xiaoxiao2021-03-01  20

记录学习路上的 点滴~

  为什么想要去想这个问题,因为帮着开发去收集数据,真的要爆炸,连接终端,打开doc输出那些adb命令,乏味无聊的模式我居然做了好久,在最后才有点开窍,我凭什么不能去写个脚本,啊~  话不多说,记录下我的这个想法到实现-----基础的基础大佬莫喷。

          py3的版本,网上找到subprocess类可以实现连接,输入输出的管道,获取子进程返回码。

        该模块好多的方法,英语比较好的同学可以去看看源码(当然我是看不懂的呢)~我的需求:实现和shell交互的语言和脚本的代码分离,面向对象的思想去给自己个安排个任务;在网上找了好多的博客大佬好像都没有这样的文章,参考各位大佬,小弟看看是否能实现。

     直接看源码Popen:

class Popen(object): def __init__(self, args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None): """Create new Popen instance."""

个人关注的几个参数:

- shell 是true ,命令行参数将通过shell 执行

- stdin, stdout and stderr 分别代表子程序的标准输入,标准输出,标准错误输出的文件句柄,

            有效值可以是一个存在的文件对象,   或者一个文件描述符,或者 PIPE(一个正整数)或者是None。

            若赋值为PIPE ,就会为子程序创建新管道pipe , 若为None ,就不会出现从定向,

            子程序继承父程序的文件句柄。另外,stderr 可以是STDOUT, 这表明子程序的错误数据可以被获得

            并发送到stdout输出.

-args  应该是字符串或程序参数序列,要执行的程序名应在参数序列的第一个位置上,后面可以跟

   程序所需要的命令行参数,也可以被显式设置通过用executable参数。

          在UNIX 上当 shell=False(默认), 在这种情况下类Popen 用  os.execvp() 来执行子程序,

   args  应该是一个序列,字符串也被看作只有程序名的序列。

   在UNIX 上,当 shell=True, 如果 args 是字符串,它将作为命令行字符串通过shell 执行.如果是一个序列,

   它的第一个元素将作为命令行字符串,后面的元素被作为附加的shell参数。

   在 Windows 上,类Popen 用 CreateProcess() 来执行子程序,它以字符串作为参数。 

   如果args 是一个序列,它将通过 list2cmdline 方法转化为字符串,要注意的是不是所有的MS Windows

   用相同的方法解释命令行。

- universal_newlines是true, 文件对象stdout,stderr将被打开作为text文件,行将被中断通过

   这些 '\n' (Unix), '\r' (Mac), '\r\n ' (Win)换行符号,所有这些外部的符号被python 看作'\n' .

   注意这些特征只在python支持通用换行的时候有效(默认支持)

   communicate()方法没有更新对文件换行属性的支持

 

先看简单封装的代码吧:

# 定义shell的返回文件 rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) media_path = media_path = os.getcwd() + '/media/' media_name = media_path + rq + 'adb.txt' media_file = open(media_name,"w") # 定义需要输入的shell指令 cmds = [ "cat proc/meminfo", "exit" ] # 创建通道,打开adb shell 注意universal_newlines属性要为Ture,因为我们创建的是str类型的列表 pipe = subprocess.Popen("adb shell", shell=True, stdin=subprocess.PIPE, stdout=media_file, universal_newlines=True) # 字节转换字符串 # codes = "\n".join(cmds)+"\n" # codes = codes.encode() # print(codes) # code = pipe.communicate("\n".join(cmds) + "\n") print(code)

进行如上操作,即在工作目录得到一个txt文本,存放列表返回的命令值:

 

 

 

简单的把想法实现成代码,真的很简单,莫喷,记录学习点滴,未完待续,

转载请注明原文地址: https://www.6miu.com/read-3450257.html

最新回复(0)