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

How can I prevent new instances of background processes when calling adb in python subprocess module

问题: 每次我在我的 monkeyrunner.py 脚本中 运行 这个 python 函数时,它都会打开一个新的后台实例(cmd、adb 和 conhost)。因此,在我的自动化脚本中,如果我有一个使用 100 次的循环,我将在后台看到每个 cmd、adb 和 conhost 运行ning 中的 100 个(我知道这一点是因为我输入"ps" 在 powershell 中获取进程列表。)该功能的目的,如果您好奇的话,是从连接的 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 而无需每次都打开一个新实例?有没有办法在同一个函数中关闭子进程?

2 件事。

  1. adb logcat 是阻塞调用。它不会 return 除非你给它发送一个 SIGINT (ctrl +c)。所以在脚本中你必须向它发送“-d”标志。如果您忘记了,您的脚本将继续等待。
  2. 您可以等待子进程完成 p.wait()

所以你可以试试这个

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 会话正确终止,并且仅在 returns

之后查看其输出

编辑:你完全正确,不需要 p.wait() 并且实际上是错误的!因为 logcat 在你的案例中向 stdout 写入了超过 4kb。您可以尝试使用 commuinicate 来帮助解决

我明白了。为了防止每次调用此函数时都在后台打开新的 adb 会话,我所要做的就是将 "p" 变量放在函数之外....像这样...

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

脚本运行后仍然存在单个adb会话打开不关闭的问题。所以,现在,开放的不是 180 个(或更多)会话,而是一个。如果我找到如何关闭会话,我将更新此票证。