python使用subprocess.Popen输出信息时,数据被截断问题分析

文章讲述了在Python中使用subprocess.Popen执行adb命令时,COMMAND列数据被截断的问题。作者发现这是由于窗口缓冲区大小导致的,解决方案是在adbshell命令后添加COLUMNS和LINES参数来调整列数和行数。
摘要由CSDN通过智能技术生成

python使用subprocess.Popen输出信息时,数据被截断问题分析

问题现象

想用python连接android设备,用adb命令进行top日志输出,具体调试代码如下

import subprocess
import os


def main():
    cmd = 'adb shell busybox top -d 1 -n 1'
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    stdout, stderr = proc.communicate()

    # Process the output
    for line in stdout.splitlines():
        print(line)


if __name__ == "__main__":
    main()

输出结果大概如下:

b'\x1b[H\x1b[JMem: 1851788K used, 139196K free, 0K shrd, 2K buff, 4069940416K cached'
b'CPU: 43.1% usr 15.6% sys  7.8% nic 31.3% idle  0.0% io  1.9% irq  0.0% sirq'
b'Load average: 2.89 2.31 2.32 5/1350 3187'
b'\x1b[7m  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND\x1b[0m'
b' 1603   165 system   S    3700m190.0   1 31.3 {ips.mediacenter} com.rockchips.me'
b' 3186   899 shell    R     3108  0.1   3  1.9 busybox top -d 1 -n 1'
b' 3171     2 root     IW       0  0.0   1  1.9 [kworker/u8:2-fl]'
b'  629   165 system   S    3899m200.2   0  0.0 {oid.tv.settings} com.android.tv.s'
b' 1951   165 u0_a2    S    3641m187.0   2  0.0 {d.process.media} android.process.'
b'  836   165 1068     S    3638m186.9   3  0.0 com.android.se'
b'  710   165 u0_a4    S    3638m186.9   0  0.0 {id.ext.services} android.ext.serv'
b'15602   165 u0_a9    S    3638m186.9   2  0.0 {id.defcontainer} com.android.defc'

从中发现COMMAND列中,打印不完整,数据都被截断了,看到现象,立刻就想到了和Windows的命令终端问题一样,就是窗口缓冲区大小的问题,但是本地调用命令是显示正常,那就找到如何设置adb shell调用大小即可

解决方法

实际上,adb shell 后面指定列行的数量就可以了

# 将命令修改如下
'adb shell COLUMNS=512 LINES=100 top -d 1 -n 1'

找了半天,原来方法就这么简单…

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值