2017-08-04 2 views
-1

問題: monkeyrunner.pyスクリプトでこのPython関数を実行するたびに、(cmd、adb、とconhost)。そして、私のオートメーションスクリプトでは、100回使用するループがあれば、バックグラウンドで実行されているcmd、adb、conhostの100個を表示します(これはpowershellに "ps"プロセスのリストを取得するために)関数の目的は、好奇心が強いならば、USB接続されたAndroidタブレットからのlogcatメッセージを探し、プロセスが終了したときを確認して、スクリーンタッチをいつコマンドするかを知ることです自動化テストを進めていきます。pythonサブプロセスモジュールで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 

QUESTION: はどのように私は新しいインスタンスを毎回開くことなく、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. あなたはそのため、あなたがこの

    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()

を完了するためのサブプロセスを待つことができますそれが返された後でのみ見られる。

EDIT:あなたは本当に正しい、p.wait()は返されない実際に間違っています!なぜなら、logcatはあなたのケースでstdoutに4kb以上を書き込むからです。その代わりにcommuinicateを使用してください。

+0

私はあなたが提供した例を試しましたが、私がそれを使用すると、関数はp.wait()にスタックするように見えます。指定されたメッセージを探すために、 "for line in p.stdout:"ループに到達することはありません。ただ無期限に待っています。 – JordanViaComputer

+0

私は提案を感謝しますが、 "communicate()"はプロセスが終了するのを待ちます。 Windows上で動作するsomethingsが必要な場合、「if logMessage in line:」ループから抜け出すとadbサブプロセスを終了(または終了)します。問題は、AndroidがMonkeyRunnerに与えるPythonのlibs(モジュール)が非常に限られており、 "terminate()"や "kill()"のようなものはこのバージョンには存在しないということです。 – JordanViaComputer

+0

ですが、 '-d'オプションがlogcatに何をしているのでしょうか?あなたはログをダンプした後に自身を終了するので、adbを殺す必要はありません –

関連する問題