我正在尝试将 cmd 命令的输出存储为 python 中的变量。
为实现这一点,我正在使用 os.system()
但 os.system()
只是运行进程,它不捕获输出。
import os
PlatformName = os.system("adb shell getprop | grep -e 'bt.name'")
DeviceName = os.system("adb shell getprop | grep -e '.product.brand'")
DeviceID = os.system("adb shell getprop | grep -e 'serialno'")
Version = os.system("adb shell getprop | grep -e 'version.release'")
print(PlatformName)
print(DeviceName)
print(DeviceID)
print(Version)
然后我尝试使用 subprocess
模块。
import subprocess
import os
PlatformName = subprocess.check_output(["adb shell getprop | grep -e 'bt.name'"])
DeviceName = subprocess.check_output(["adb shell getprop | grep -e '.product.brand'"])
DeviceID = subprocess.check_output(["adb shell getprop | grep -e 'serialno'"])
Version = subprocess.check_output(["adb shell getprop | grep -e 'version.release'"])
print(PlatformName)
print(DeviceName)
print(DeviceID)
print(Version)
我收到以下错误
FileNotFoundError: [WinError 2] The system cannot find the file specified
如何将命令的输出存储为变量?
最佳答案
这里的问题:
- 真的不推荐像这样传递参数(列表中的字符串,带空格)
- 像这样传递参数需要
shell=True
才能有一点机会工作,而shell=True
因安全问题(以及其他问题)而闻名,比如不可移植性) grep
在 Windows 上不是标准的,模式是正则表达式,这意味着您可能必须转义.
("bt\.name"
).- 当未找到时
grep
返回 1 并使check_output
失败。 - 当找到
grep
返回匹配项和一个换行符时,您必须去除这些内容
我会重写这个:
PlatformName = subprocess.check_output(["adb shell getprop | grep -e 'bt.name'"])
作为:
output = subprocess.check_output(["adb","shell","getprop"])
platform_name = next((line for line in output.decode().splitlines() if "bt.name" in line),"")
第二行是 grep 的“本地”版本(没有正则表达式)。它返回输出行中第一次出现的“bt.line”,如果未找到则返回空字符串。
你在这里不需要grep
(上面不是严格等价的,因为它产生第一次出现,而不是所有出现但这对你的情况应该没问题)。您的客户端可能没有在 Windows 上安装 grep
。
关于python - 将 cmd 命令的过滤输出存储在变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52363569/