windows下python subprocess.Popen执行adb 命令进程无法终止

logcmd = "adb logcat -v time > C:/log.txt"

self.Popen = subprocess.Popen(logcmd ,stdout = subprocess.PIPE,shell=True)

用上面的方法来获取logcat的信息,它的实际原理是另外开启一个cmd命令来运行adb logcat的命令,即使后面用popen.terminate()也只能关闭cmd的命令,cmd命令被kill掉后,adb的线程由系统来托管,杀死不了adb的进程,从而导致adb logcat不能退出

解决思路:直接启动adb logcat,不能通过cmd命令来启动,就是不能启动cmd进程,然后cmd进程来启动adb进程,代码如下:

filename = "C:/log.txt"
logcat_file = open(filename, 'w')
logcmd = "adb logcat -v time"
self.Poplog = subprocess.P open (logcmd,stdout=logcat_file,stderr=subprocess.PIPE)

最后使用完记得关闭:Poplog.terminate()

————————————————————————————————————————

logcmd = "adb -s devices logcat >logcat.txt"
Poplog = subprocess.Popen(logcmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Poplog.wait(6)
(stdoutput,erroutput) = Poplog.communicate()
def Grab_log():
    import os
    import datetime
    dt = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    dt_ms = datetime.datetime.now().strftime('%Y-%m-%d')
    file = str(file_exsits("D:/Aotoproject/log/" + dt_ms + "_log"))
    print(file)
    s = os.popen("adb devices")
    a = s.read()
    list = a.split('\n')
    deviceList = []
    for temp in list:
        if len(temp.split()) > 1:
            if temp.split()[1] == 'device':
                deviceList.append(temp.split()[0])
    print('本次共扫描出%s个安卓设备' % len(deviceList))
    for devices in deviceList:
        print(devices)
        ###抓取logcat日志###
        logcat_filename = file+"/" + devices +"_"+ dt_ms +"_"+"logcat_log.txt"
        logcat_file = open(logcat_filename, 'w')
        logcmd = "adb -s "+ devices +" logcat "
        Poplog = subprocess.Popen(logcmd, stdout=logcat_file, stderr=subprocess.PIPE)
        sleep(2)
        Poplog.terminate()
        ###抓取Radio日志###
        radio_filename = file+"/"  + devices + "_" + dt_ms + "_" + "radio_log.txt"
        logcat_file = open(radio_filename, 'w')
        logcmd = "adb -s " + devices + " logcat -b radio "
        Poplog = subprocess.Popen(logcmd, stdout=logcat_file, stderr=subprocess.PIPE)
        sleep(2)
        Poplog.terminate()
        ###抓取Main日志###
        main_filename = file+"/"  + devices + "_" + dt_ms + "_" + "main_log.txt"
        logcat_file = open(main_filename, 'w')
        logcmd = "adb -s " + devices + " logcat -b main "
        Poplog = subprocess.Popen(logcmd, stdout=logcat_file, stderr=subprocess.PIPE)
        sleep(2)
        Poplog.terminate()
        ###抓取Event日志###
        event_filename = file+"/"   + devices + "_" + dt_ms + "_" + "event_log.txt"
        logcat_file = open(event_filename, 'w')
        logcmd = "adb -s " + devices + " logcat -b event "
        Poplog = subprocess.Popen(logcmd, stdout=logcat_file, stderr=subprocess.PIPE)
        sleep(2)
        Poplog.terminate()
        ###抓取kernel日志###
        kernel_filename = file+"/"  + devices + "_" + dt_ms + "_" + "kernel_log.txt"
        logcat_file = open(kernel_filename, 'w')
        logcmd = "adb -s " + devices + " cat /proc/kmsg"
        Poplog = subprocess.Popen(logcmd, stdout=logcat_file, stderr=subprocess.PIPE)
        sleep(2)
        Poplog.terminate()
        print(devices,"抓取完成")

原文链接:

http://www.th7.cn/Program/Python/201507/513606.shtml

popen包在 python 中提供了一个简单的类似 shell 的语法来运行外部命令。 链接(又名管道)为Sh('ls') | 'sort' Sh('ls') | 'sort' 将标准错误重定向到标准输出作为Sh('make').include_stderr | 'wc' Sh('make').include_stderr | 'wc' 将输出重定向到文件Sh('ls') > '~/listing.txt' 对输出行for line in Sh('ls'):迭代,如for line in Sh('ls'): 将输入流式传输到链中的命令中作为Sh.pipe('~/listing.txt').Sh('grep', '-q', 'code').returncode 扩展特殊字符 ( ~*!? ) 将 env vars ( $HOME ) 扩展为pri # 执行外部shell命令, 输出结果输出管道 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) p.wait() # 从标准输出读出shell命令的输出结果 #rt = p.stdout.read().decode() ssh子进程 ssh-subprocess是一个小的Python模块,提供进程的API,用于通过SSH远程执行命令。 该模块依赖于OpenSSH的SSH功能,并且需要非交互式(例如,公钥)身份验证。 该模块还支持SCP文件传输,以上传和下载文件和目录。 准备SSH连接 首先建立与远程服务器的连接: import ssh_subprocess ssh = ssh_subprocess . Ssh ( host = 'hostname' , user = 'joe' , host_key_checking = 'no' ) 运行命令执行命令: result = ssh . call ( 'echo "Hello world!" > message' ) 就像call()在子, call()中的ssh-子返回命令的退出状态。 在这种情况下,它是echo命令的退出状态。 还 split() 方法可以实现将一个字符串按照指定的分隔符切分成多个子串,这些子串会被保存到列表中(不包含分隔符),作为方法的返回值反馈回来。该方法的基本语法格式如下: str.split(sep,maxsplit) 此方法中各部分参数的含义分别是: str:表示要进行分割的字符串; sep:用于指定分隔符,可以包含多个字符。此参数默认为 None,表示所有空字符,包括空格、换行符“\n”、制表符“\t”等。 maxsplit:可选参数,用于指定分割的次数,最后列表中子串的个数最多为 maxsplit+1。如 用上面的方法来获取logcat的信息,它的实际原理是另外开启一个cmd命令来运行python demo.py的命令,即使后面用popen.terminate()也只能关闭cmd的命令,cmd命令被kill掉后,python demo.py的线程由系统来托管,杀死不了python demo.py的进程,从而导致python demo.py不能退出.要执行的脚本是一个死循环的脚本,那么我们就需要手动的来关闭这个脚本,而无法等待这个脚本自己结束。python中有一个很好用的方式来开启进程,即。 可以根据上面函数返回的process对象,用该对象的stdout().read().decode()方法即可获得执行adb命令的返回值。这是封装的一个通用的执行ADB命令的方法,返回的是一个process对象。executeDir 参数是就是我电脑上ADB环境的路径;由于最近的工作需要频繁的操作adb端口,所以现将操作ADB命令的方法分享出来。综上,执行其他adb命令也可用上面介绍的方法;这个比较简单就不过多赘述了!其实原理非常简单,我本来不屑于写这篇文章,但是万一真的有人需要呢? subprocess.Popen(): 在一些复杂场景中,我们需要将一个进程执行输出作为另一个进程的输入。在另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。这个时候我们就需要使用到suprocess的Popen()方法。该方法有以下参数: args:shell命令,可以是字符串,或者序列类型,如list,tuple。 bufsize:缓冲区大小,可不用关心 stdi... 记录一下踩过的坑,希望碰到此问题的人能看到,平时对subprocess.Popen()了解不多,就用来执行命令,都没出现什么问题,此次开发中,使用subprocess.Popen()执行命令是数据备份,当数据量过大时,一直不能结束http会话,返回前端响应,然后就各种搜资料解决,最后找到原因。close_fds=True:查看文档,发现加上此参数后,解决问题。在python3.4以后,已经默认等于True。... import os    mystr=os.popen("tasklist")  #popen与system可以执行指令,popen可以接受返回对象  mystr=mystr.read() #读取输出  print("hello",mystr)  if mystr.find("QQ.exe") !=-1:      print("发现QQ")  else:      print("QQ已死有事请烧... 在一项针对不同远程点音视频流探测和统计任务中,系统使用ubuntu kylin通过contrab的方式定期探测分散的不同远程点传送回中心的音视频流过程中,发现系统在运行一段时间后就会残留的ffprobe进程越来越多,导致系统速度变慢卡死 ps -ef | grep ffprobe 查看了一下,系统中残留这大把没有返回的进程,对于没有返回的进程,我的处理方式是:p=subprocess.Pope...