将过滤后的cmd命令输出存储在变量中

时间:2018-09-17 08:25:05

标签: python variables cmd

我试图将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]系统找不到文件   指定

如何将命令的输出存储为变量?

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,等等