如何防止后台进程的新实例调用蟒子模块ADB当

问题描述:

问题: 每次我在monkeyrunner.py脚本运行这条巨蟒的功能,它打开的(CMD,亚行新的背景情况下,和conhost)。所以,在我的自动化脚本中,如果我有一个循环使用了100次,我会看到每个cmd,adb和conhost在后台运行100个(我知道这是因为我在powershell中输入了“ps”以获取进程列表)。如果您好奇,该功能的目的是从USB连接的Android平板电脑上查找logcat消息,以查看进程何时完成,以便脚本知道何时命令屏幕触摸继续进行自动化测试。如何防止后台进程的新实例调用蟒子模块ADB当

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 

问题: 如何使用“子”打开ADB不必每次都打开一个新的实例?有没有办法在同一个函数中关闭子进程?

我想通了。为了防止在每次调用此函数时在后台打开一个新的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个会议(或更多)开幕式,只有一个。如果我发现如何关闭会话,我将更新此票证。

2件事。

  1. adb logcat是一个阻塞呼叫。它不会返回,除非您发送一个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完全终止,其输出只有在它返回后才被查看

编辑:你是绝对正确的,p.wait()不是需要而且实际上是错误的!因为logcat在你的case中写入超过4kb的标准输出。你可以尝试使用commuinicate来代替

+0

我试过你提供的例子,但是当我使用它时,函数似乎卡在p.wait()上。它永远不会到达“for p.stdout:”循环中的行,以查找指定的消息。它只是无限期地等待。 – JordanViaComputer

+0

我欣赏这个建议,但“沟通()”等待一个进程终止。我需要一些可以在Windows上运行的东西,一旦它突破“if logMessage in line:”循环,就会终止(或终止)adb子进程。问题是,Android为MonkeyRunner提供的python库(模块)非常有限,此版本中不存在“terminate()”或“kill()”之类的东西。 – JordanViaComputer

+0

但是这不是'-d'选项对logcat的作用么?你不必杀死adb,因为转储日志后它会退出 –