0

adb(android debug bridge) shell のストレステストを実行したいです。(この点で adb シェルは、Android フォンによって提供される単なるコマンド ライン ツールです)。

Python からサブプロセスを作成し、このサブプロセスで「adb shell」コマンドを実行します。サブプロセスの適切な標準入力を介して提供しているこのサブプロセスに与える必要があるコマンドがいくつかあります。

すべて問題ないように見えますが、ストレス テストを実行しているときです。約100回の繰り返しの後、標準入力に与えるコマンドがサブプロセスに到達しません。別の端末でコマンドを実行すると、正常に動作します。しかし、問題はこの stdin にあります。

誰が私が間違っているのか教えてもらえますか。以下はコードサンプルです

class ADB():
def __init__(self):
    self.proc = subprocess.Popen('adb shell', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True,bufsize=0)


def provideAMcommand(self, testParam):
    try:
        cmd1 = "am startservice -n com.test.myapp/.ADBSupport -e \"" + "command" + "\" \"" + "test" + "\""  
        cmd2 = " -e \"" + "param" + "\"" + " " + testParam
        print cmd1+cmd2
        sys.stdout.flush()
        self.proc.stdin.write(cmd1 + cmd2 + "\n")
    except:
        raise Exception("Phone is not Connected to Desktop or ADB is not available \n")
4

2 に答える 2

1

最初のいくつかのコマンドで機能するが、後でブロックする場合は、読み取りを忘れてself.proc.stdoutいる可能性があり、(ドキュメントで警告されているように) OS パイプ バッファーがいっぱいになり、子プロセスがブロックされる可能性があります。

出力を破棄するには、次のようにリダイレクトしos.devnullます。

import os
from subprocess import Popen, PIPE, STDOUT

DEVNULL = open(os.devnull, 'wb')
# ...
self.proc = Popen(['adb', 'shell'], stdin=PIPE, stdout=DEVNULL, stderr=STDOUT)
# ...
self.proc.stdin.write(cmd1 + cmd2 + "\n")
self.proc.stdin.flush()

ダイアログベースの対話のためのより良いツールとなる可能性のあるpexpectモジュールがあります (断続的に読み取り/書き込みの両方が必要な場合)。

于 2013-08-21T11:50:19.587 に答える
0

INprovideAMcommandメインプロセスの stdout に書き込み、フラッシュしています。で作成した子プロセスの標準入力には何も送信されませんPopen。次のコードは、新しい bash 子プロセスを作成します。これは、 のコードに少し似ています__init__

import subprocess as sp
cproc = sp.Popen("bash", stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE, shell=True)

ここで、その子プロセスと通信する最も簡単な方法は次のとおりです。

#Send command 'ls' to bash.
out, err = cproc.communicate("ls")

これにより、テキスト「ls」とEOFがbashに送信されます(テキスト「ls」のみを含むbashスクリプトを実行するのと同じです)。Bash は ls コマンドを実行して終了します。bash または ls が stdout および stderr に書き込むものはすべて、変数outand にerrそれぞれ格納されます。私は adb シェルを使用していませんが、この点では bash のように動作すると思います。

stdout子プロセスが端末に出力するだけの場合は、およびstderr引数を に指定しないでくださいPopen

子の終了コードを確認し、ゼロ以外の場合 (エラーを示す) 例外を発生させることができます。

if (cproc.returncode != 0):
     raise Exception("Child process returned non-zero exit code")
于 2013-08-20T01:22:47.970 に答える