Python 在100次迭代后无法向子流程(运行adb shell命令的流程)提供输入

Python 在100次迭代后无法向子流程(运行adb shell命令的流程)提供输入,python,subprocess,Python,Subprocess,我想为adb(android调试桥)shell运行一个压力测试。(在这方面,adb shell只是Android手机提供的一个命令行工具) 我从python创建了一个子进程,并在这个子进程中执行“adb shell”命令。我通过子进程的stdin提供了一些必须给这个子进程的命令 一切似乎都很好,但当我进行压力测试时。在大约100次迭代之后,我给stdin的命令没有到达子进程。如果我在单独的终端中运行命令,它运行正常。但问题在于这个标准 谁能告诉我我做错了什么。下面是代码示例 class ADB(

我想为adb(android调试桥)shell运行一个压力测试。(在这方面,adb shell只是Android手机提供的一个命令行工具)

我从python创建了一个子进程,并在这个子进程中执行“adb shell”命令。我通过子进程的stdin提供了一些必须给这个子进程的命令

一切似乎都很好,但当我进行压力测试时。在大约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")

provideAMcommand
中,您正在写入并刷新主进程的标准输出。这将不会向您使用
Popen
创建的子进程的stdin发送任何内容。下面的代码创建了一个新的bash子进程,有点像
\uuuu init\uuuu
中的代码:

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")
这将向bash发送文本“ls”和EOF(相当于运行一个只包含文本“ls”的bash脚本)。Bash将执行ls命令,然后退出。bash或ls写入stdout和stderr的任何内容都将分别在变量
out
err
中结束。我没有使用adb shell,但我猜它在这方面的行为类似于bash

如果只希望子进程打印到终端,请不要将
stdout
stderr
参数指定到
Popen

您可以检查子级的退出代码,如果该代码非零(表示错误),则引发异常:


如果它适用于前几个命令,但稍后会阻塞,那么您可能会忘记读取
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()

对于基于对话框的交互,这可能是一个更好的工具(如果您希望读/写都是间歇的)。

给定您的代码;没有命令到达子流程。我已添加了行。。我错误地删除了该行。我在ProvideAdminCommand中又添加了一行。由于错误,我删除了该行,我正在为Windows运行该行。我将对此进行检查,并让您知道该行是否有效。。我觉得这就是正在发生的事情。提前谢谢
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()