-1

subprocess.popen を使用して、adb shell monkey -p -v コマンドと adb logcat コマンドを実行する小さな python 関数を作成しました。値が 100 より大きい場合、このプログラムはクラッシュしますが、その理由はわかりません。

ここにmonkey_runner.pyがあります

import os, subprocess
def run_monkey_process(package, num_commands):
        monkeycmd = "adb shell monkey -p " + package + " -v " + num_commands
        monkeyprocess = subprocess.Popen(monkeycmd, stdout=subprocess.PIPE)
        logcatcmd = "adb logcat"
        logcatprocess = subprocess.Popen(logcatcmd, stdout=subprocess.PIPE)
        monkeystring = monkeyprocess.communicate(input=None)[0]
        logcatstring = logcatprocess.communicate(input=None)[0]
        monkeyreturncode = monkeyprocess.poll()
        logcatreturncode = logcatprocess.poll()


        if(monkeyreturncode >=0):
                monkeyprocess.kill()
                logcatprocess.kill()

                return monkeystring, logcatstring

        else:
                print 'command failure'
                return 'you', 'fail'

ここに GUI コードを入れることもできますが、それは特別なことではありません。

ここにスタックトレースがあります

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1470, in __call__
    return self.func(*args)
  File "C:\Users\brandon.dalesandro\Desktop\Zonar\mankey\monkey_runner_gui.py", line 25, in goCallBack
    returned = run_monkey_process(package, num)
  File "C:\Users\brandon.dalesandro\Desktop\Zonar\mankey\monkey_runner.py", line 8, in run_monkey_process
    logcatstring = logcatprocess.communicate(input=None)[0]
  File "C:\Python27\lib\subprocess.py", line 798, in communicate
    stdout = _eintr_retry_call(self.stdout.read)
  File "C:\Python27\lib\subprocess.py", line 478, in _eintr_retry_call
    return func(*args)
KeyboardInterrupt
4

1 に答える 1

0

これはあなたの問題かもしれませんが、それ以上の情報がないと判断するのは難しいです…</p>

サブプロセスにパイプを与えましたが、終了するまでそこから読み取りません。ドキュメントの警告は、これが悪い理由を説明しています:

stdout=PIPEこれは、and/orstderr=PIPEを使用し、子プロセスがパイプに十分な出力を生成して、OS パイプ バッファーがさらにデータを受け入れるのを待ってブロックする場合にデッドロックします。communicate()それを回避するために使用します。

少数のコマンド (パイプ バッファーを満たすのに十分なデータがない場合) では機能しますが、多数のコマンドではハングすることは完全に理にかなっています。

poll呼び出す代わりにループしても何の役にwaitも立ちません。理由もなく 100% の CPU を消費するだけです。あなたはまだパイプから読んでいません。

また、プロセスが終了した後に呼び出すことcommunicateも役に立ちません。パイプがいっぱいになると、サブプロセスは永久にブロックされpoll、値を返すことはなく、communicate.

そして、communicateすでに独自の を実行しているwaitため、本当に必要なのは次のとおりです。

monkeyprocess = subprocess.Popen(monkeycmd, stdout=subprocess.PIPE, bufsize=1)
monkeystring = monkeyprocess.communicate(input=None)[0]
returncode = monkeyprocess.returncode
于 2013-08-23T00:42:09.273 に答える