我试图将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]系统找不到文件 指定
如何将命令的输出存储为变量?
答案 0 :(得分:7)
这里的问题:
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
(以上内容并非严格等效,因为它会产生 first 发生,而不是 all 发生,但是应该对你的情况还可以)。而且您的客户端可能未在Windows上安装grep
。
答案 1 :(得分:2)
嘿,我遇到了与您相同的问题。即使使用to
,子流程也可以执行您想要的操作。诀窍是communicate()方法。
shell=False
现在,您只需要一个小功能即可扫描with subprocess.Popen(cmdCode,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
cwd = workingDir,
bufsize=1,
universal_newlines = True) as proc:
#output is stored in proc.stdout
#errors are stored in proc.stderr
以获取所需信息:proc.stdout
,等等