代码之家  ›  专栏  ›  技术社区  ›  AutoTester213

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

  •  7
  • AutoTester213  · 技术社区  · 7 年前

    我正在尝试将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 回复  |  直到 7 年前
        1
  •  7
  •   Jean-François Fabre    7 年前

    • 不建议这样传递参数(列表中的字符串,带空格)
    • 像这样的辩论需要 shell=True 让它有一点机会工作 以安全问题(以及其他问题,如不可移植性)著称
    • grep 在windows上不是标准的,而且模式是regex,这意味着您可能必须退出 . ( "bt\.name"
    • 找不到时 格雷普 返回1,将使 check_output
    • 找到时 返回匹配项和换行符,您必须将其删除

    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的“本机”版本(没有regex)。它返回第一次出现的“bt.line如果找不到,则返回空字符串。

    你不需要 格雷普 在这里(上面不是严格等价的,因为它产生 第一 全部的 但你的案子应该没问题)。你的客户可能没有 安装在Windows上。

        2
  •  2
  •   Sharku    7 年前

    嘿,我和你有同样的问题。子进程可以做你想做的事情,甚至可以使用 shell=False . 诀窍在于 communicate() 方法。

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