2017-08-04 32 views
-1

問題: 每次我在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不必每次都打開一個新的實例?有沒有辦法在同一個函數中關閉子進程?

回答

-1

我想通了。爲了防止在每次調用此函數時在後臺打開一個新的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個會議(或更多)開幕式,只有一個。如果我發現如何關閉會話,我將更新此票證。

0

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,因爲轉儲日誌後它會退出 –

相關問題