在 python 子进程模块中调用 adb 时如何防止后台进程的新实例
How can I prevent new instances of background processes when calling adb in python subprocess module
问题:
每次我在我的 monkeyrunner.py 脚本中 运行 这个 python 函数时,它都会打开一个新的后台实例(cmd、adb 和 conhost)。因此,在我的自动化脚本中,如果我有一个使用 100 次的循环,我将在后台看到每个 cmd、adb 和 conhost 运行ning 中的 100 个(我知道这一点是因为我输入"ps" 在 powershell 中获取进程列表。)该功能的目的,如果您好奇的话,是从连接的 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 而无需每次都打开一个新实例?有没有办法在同一个函数中关闭子进程?
2 件事。
adb logcat
是阻塞调用。它不会 return 除非你给它发送一个 SIGINT (ctrl +c)。所以在脚本中你必须向它发送“-d”标志。如果您忘记了,您的脚本将继续等待。
您可以等待子进程完成 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 会话正确终止,并且仅在 returns
之后查看其输出
编辑:你完全正确,不需要 p.wait() 并且实际上是错误的!因为 logcat 在你的案例中向 stdout 写入了超过 4kb。您可以尝试使用 commuinicate 来帮助解决
我明白了。为了防止每次调用此函数时都在后台打开新的 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 个(或更多)会话,而是一个。如果我找到如何关闭会话,我将更新此票证。
问题: 每次我在我的 monkeyrunner.py 脚本中 运行 这个 python 函数时,它都会打开一个新的后台实例(cmd、adb 和 conhost)。因此,在我的自动化脚本中,如果我有一个使用 100 次的循环,我将在后台看到每个 cmd、adb 和 conhost 运行ning 中的 100 个(我知道这一点是因为我输入"ps" 在 powershell 中获取进程列表。)该功能的目的,如果您好奇的话,是从连接的 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 而无需每次都打开一个新实例?有没有办法在同一个函数中关闭子进程?
2 件事。
adb logcat
是阻塞调用。它不会 return 除非你给它发送一个 SIGINT (ctrl +c)。所以在脚本中你必须向它发送“-d”标志。如果您忘记了,您的脚本将继续等待。您可以等待子进程完成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 会话正确终止,并且仅在 returns
之后查看其输出编辑:你完全正确,不需要 p.wait() 并且实际上是错误的!因为 logcat 在你的案例中向 stdout 写入了超过 4kb。您可以尝试使用 commuinicate 来帮助解决
我明白了。为了防止每次调用此函数时都在后台打开新的 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 个(或更多)会话,而是一个。如果我找到如何关闭会话,我将更新此票证。