问题: 每次我在monkeyrunner.py脚本中运行这个python函数时,它都会打开一个新的后台实例(cmd,adb和conhost)。所以,在我的自动化脚本中,如果我有一个使用100次的循环,我将看到每个cmd,adb和conhost在后台运行100个(我知道这是因为我在powershell中输入“ps”获取进程列表。)如果你很好奇,该函数的目的是从USB连接的Android平板电脑中查找logcat消息,以查看进程何时完成,以便脚本知道何时命令屏幕触摸推进自动化测试。
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
问题: 如何在不打开新实例的情况下使用“subprocess”打开adb?有没有办法在同一个函数中关闭子进程?
答案 0 :(得分:0)
2件事。
adb logcat
是一个阻止通话。除非你发送一个SIGINT(ctrl + c),否则它不会返回。所以在脚本中你必须发送&#34; -d&#34;旗。如果您忘记了脚本将继续等待。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的adb会话都会正确终止,并且只有在返回后才会查看其输出
编辑:你是绝对正确的,p.wait()不是必需的,实际上是错误的!因为logcat在你的例子中写入超过4kb的stdout。您可以尝试使用commuinicate代替帮助