在python子进程模块中调用adb时,如何防止后台进程的新实例

时间:2017-08-04 19:26:57

标签: android python adb monkeyrunner

问题: 每次我在monkeyrunner.py脚本中运行这个python函数时,它都会打开一个新的后台实例(cmd,adb和conhost)。所以,在我的自动化脚本中,如果我有一个使用100次的循环,我将看到每个cmd,adb和conhost在后台运行100个(我知道这是因为我在powershell中输入“ps”获取进程列表。)如果你很好奇,该函数的目的是从USB连接的Android平板电脑中查找logcat消息,以查看进程何时完成,以便脚本知道何时命令屏幕触摸推进自动化测试。

action = "____"
waitTime = 1
def adb(logMessage, action):
    start = time.time()
    p = subprocess.Popen("adb logcat -v time", shell=True, cwd="C:\Users\<USERNAME>\AppData\Local\Android\sdk\platform-tools", stdout=subprocess.PIPE)
    for line in p.stdout:
        if logMessage in line:
            print("Found message!")
            break
            pass
        else:
            continue

问题: 如何在不打开新实例的情况下使用“subprocess”打开adb?有没有办法在同一个函数中关闭子进程?

1 个答案:

答案 0 :(得分:0)

2件事。

  1. adb logcat是一个阻止通话。除非你发送一个SIGINT(ctrl + c),否则它不会返回。所以在脚本中你必须发送&#34; -d&#34;旗。如果您忘记了脚本将继续等待。
  2. 您可以等待子进程完成p.wait()
  3. 因此你可以尝试这个

    action = "____"
    waitTime = 1
    def adb(logMessage, action):
        start = time.time()
        p = subprocess.Popen("adb logcat -d -v time", shell=True, cwd="C:\Users\<USERNAME>\AppData\Local\Android\sdk\platform-tools", stdout=subprocess.PIPE)
        #p.wait()
        for line in p.stdout:
            if logMessage in line:
                print("Found message!")
                break
                pass
            else:
                continue
    

    这将确保每次启动以查看logact的adb会话都会正确终止,并且只有在返回后才会查看其输出

    编辑:你是绝对正确的,p.wait()不是必需的,实际上是错误的!因为logcat在你的例子中写入超过4kb的stdout。您可以尝试使用commuinicate代替帮助