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...