2017-08-04 1 views
-1

PROBLÈME: Chaque fois que je lance cette fonction python dans mon script monkeyrunner.py, il ouvre une nouvelle instance de fond (cmd, adb, et conhost). Et donc, dans mon script d'automatisation, si j'ai une boucle qui utilise 100 fois, je vais voir 100 de chaque cmd, adb et conhost en arrière-plan (je le sais parce que je sais "ps" dans PowerShell pour obtenir la liste des processus.) Le but de la fonction, si vous êtes curieux, est de rechercher des messages logcat à partir de la tablette Android attachée USB, pour voir quand les processus sont terminés, afin que le script sache quand commander les touches de l'écran pour aller de l'avant avec les tests d'automatisation.Comment puis-je éviter de nouvelles instances de processus d'arrière-plan lors de l'appel adb dans le module subprocess python

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 

QUESTION: Comment puis-je utiliser "sous-processus" pour ouvrir adb SANS ouvrir une nouvelle instance à chaque fois? Y at-il un moyen de fermer le sous-processus dans la même fonction?

Répondre

-1

Je l'ai compris. Pour éviter une nouvelle session de adb d'ouverture en arrière-plan pour chaque fois que cette fonction est appelée, tout ce que je devais faire est de placer la variable « p » en dehors de la fonction .... comme ça ...

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 

Il existe toujours le problème d'une seule session adb qui s'ouvre et ne se ferme pas après l'exécution du script. Donc, maintenant, au lieu de 180 sessions (ou plus) d'ouverture, il y en a une seule. Si je découvre comment fermer la session, je mettrai à jour ce ticket.

0

2 choses.

  1. adb logcat est un appel bloquant. Il ne retourne pas sauf si vous lui envoyez un SIGINT (ctrl + c). Donc, dans un script, vous devez lui envoyer le drapeau "-d". Si vous oubliez votre script, vous continuerez à attendre.
  2. vous pouvez attendre un sous-processus pour terminer avec p.wait()

Par conséquent, vous pouvez essayer cette

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 

Cela garantira que chaque session adb lancée pour regarder logact se termine correctement et sa sortie est regardé seulement après qu'il retourne

EDIT: Vous avez absolument raison, p.wait() n'est pas nécessaire et est réellement faux! parce que le logcat écrit plus de 4kb à stdout dans votre cas. Vous pourriez essayer d'utiliser commuinicate à la place pour aider avec cela

+0

J'ai essayé l'exemple que vous avez fourni, mais quand je l'utilise, la fonction semble être bloquée sur p.wait(). Il n'obtient jamais la boucle "for line in p.stdout:", pour rechercher le message spécifié. Il attend juste indéfiniment. – JordanViaComputer

+0

J'apprécie la suggestion, mais "communicate()" attend qu'un processus se termine. J'ai besoin de quelque chose, qui fonctionne sous Windows, qui termine (ou tue) le sous-processus adb une fois qu'il est sorti de la boucle "if logMessage in line:". Le problème est que les librairies python (modules) que Android vous donne pour MonkeyRunner sont très limitées, et des choses comme "terminate()" ou "kill()" n'existent pas dans cette version. – JordanViaComputer

+0

mais n'est-ce pas ce que l'option '-d' fait pour logcat? vous n'avez pas besoin de tuer adb car il sortira lui-même après avoir jeté le journal –