【问题标题】:Python 2 subprocess (dmidecode) to a variable? [duplicate]Python 2 子进程(dmidecode)到变量? [复制]
【发布时间】:2015-10-01 20:27:18
【问题描述】:

我在 linux 中运行 dmidecode 来获取硬件信息列表。阅读输出并选择某些信息的最佳方法是什么?例如获取产品名称:dmidecode 的一部分?

目前我正在将子进程输出写入文件,然后读取给定字符串的文件。这似乎是一种低效的做事方式。

我也知道 python dmidecode 模型,但对于我的生活我无法让它工作它只是一直说没有 bios 属性

【问题讨论】:

  • @J.F.Sebastian 如何将其标记为重复?链接的问题仅显示如何存储子流程的输出,我知道这是如何完成的,我想要获得子流程输出的某个部分的最佳方法。最近这里的重复旅很荒谬,如果你没有更好的事情要做至少阅读问题
  • 您的问题有 no 表明您知道如何存储子流程的输出。 edit 它,包括此信息:以表明您的问题不同。你的问题是什么?如何在字节串或字符串列表中找到包含'Product Name' 的行?
  • “读取输出并选择某些信息的最佳方法是什么?例如获取产品名称:dmidecode 的一部分?”我认为在我想选择它的某个部分的问题中很清楚
  • 我仍然看到“没有迹象表明您知道如何存储子进程的输出”。这是一个正则表达式问题吗?你想要re.findall(br'Product Name: (.*?)$', output, re.M)吗?

标签: python linux python-2.7 dmi


【解决方案1】:

如果您知道要查找的特定关键字,可以输入:dmidecode -s keyword

在你的情况下是:

dmidecode -s system-product-name

您还可以按类型过滤。例如:

  • 返回系统信息:

    dmidecode -t1
    
  • 返回基板信息:

    dmidecode -t2 
    
  • 返回机箱信息:

    dmidecode -t3
    

【讨论】:

  • 您是否有 dmidecode 中所有项目的列表,例如 system-product-name?
  • 是的,你可以从这个人那里找到它。这是列表:bios-vendor、bios-version、bios-release-date、system-manufacturer、system-product-name、system-version、system-serial-number、system-uuid、baseboard-manufacturer、baseboard -产品名称、基板版本、基板序列号、基板资产标签、机箱制造商、机箱类型、机箱版本、机箱序列号、机箱资产标签、处理器系列, 处理器制造商, 处理器版本, 处理器频率
  • @twigg:运行dmidecode -s 获取完整列表
【解决方案2】:

您可以通过多种方式使用subprocess 模块在python 脚本中获取命令的输出。

  1. subprocess.Popen() - 您可以使用此Popen 类将stdout 指定为subprocess.PIPE 启动命令行进程,然后使用communicate 函数获取结果。示例 -

    import subprocess
    p = subprocess.Popen(['dmidecode'] , stdout=subprocess.PIPE)
    result = p.communicate()[0]
    
  2. subprocess.check_output() - 此函数在执行命令后将命令的输出(输出到标准输出)作为字节字符串返回。示例 -

    import subprocess
    result = subprocess.check_output(['dmidecode'])
    

对于您的特定情况,subprocess.check_output() 很可能更适合,因为您不需要为流程提供任何输入。

使用subprocess.Popen(),您还可能需要通过 PIPING 进程的stdin 为进程提供输入。

【讨论】:

  • 如果有check_output(),为什么还要显示Popen() + .communicate()
  • 我只是给出了一些可能性。他们可以选择他们想要的任何东西。
  • 您没有指定任何标准来说明为什么一个应该比另一个更可取。为什么这两种具体方法?还有很多其他方法,我没有看到它们被提及——为什么要停止?
  • 我指定了我知道的方法。如果您知道更多方法,请告诉我。
  • 有很多方法可以在不同的情况下使用(是否需要使用输出before子进程退出(iter(p.stdout.readline, b''));是否需要与在终端中(pexpect、pty);您是否需要在 GUI 应用程序中获取输出(线程、async.io);您是否需要分别捕获 stdout 和 stderr(.communicate())等 - 太多了全部列出)。我认为没有理由提及其他方法,除非在这种特殊情况下有特定理由更喜欢其他方法。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 2016-02-12
  • 2014-12-11
  • 2015-01-03
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多