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

在Python中从shell命令获取stdout时出现问题

  •  0
  • Batcastle  · 技术社区  · 6 年前

    我有一行Unix Shell代码:

    lsusb | sed -e 's/.*ID \([a-f0-9]\+:[a-f0-9]\+\).*/\1/g'
    

    我希望通过Python中的脚本将其传递给shell,并能够捕获stdout中的输出,因为它将在运行该行代码后显示在终端中。

    然而,我无法让它做到这一点。我尝试过:

    • 设置要保持输出(x)等于的变量 os.system(lsusb | sed -e 's/.*ID \([a-f0-9]\+:[a-f0-9]\+\).*/\1/g')

    • 背景 x 变量等于 subprocess.Popen() 将所有这些乱七八糟的东西作为列表插入,将标准输出设置为管道,将标准输出和标准输出设置为 DEVNULL

    • 背景 十、 等于 subprocess.check_output() ,再次传入整行代码。

    • 背景 十、 等于的输出 run()

    我也试过写作 lsusb 然后将其传递给 sed 而不是管道。我尝试过传递整行代码,将所有这些设置为shell中的变量,然后设置变量 十、 等于shell变量。最后,我尝试将这一行代码的输出传递到一个文件并读取其中的内容。

    我尝试过的一切都会给我:

    • 只有0个

    • 这些小方形字符内有3个零和1

    • 没有什么

    如何获取我想要传递给的数据 十、 字符串格式的变量?这已经困扰了我好几天了,没有任何帮助。如果我需要使用Python 3,这是可以的,尽管我更喜欢使用Python 2。

    谢谢大家的帮助!如果您需要更多信息,请询问,我很乐意将其编辑到问题中,以供大家查看。

    再次感谢您!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Jon    6 年前

    关于如何在Python中捕获shell命令的输出,有一个很好的答案

    Running shell command from Python and capturing the output

    在这种情况下,我怀疑您需要使用

    subprocess.check_output("lsusb | sed -e 's/.*ID \([a-f0-9]\+:[a-f0-9]\+\).*/\1/g'", shell=True)
    

    你需要 shell=True 否则,Python将把字符串解释为单个命令,而不是管道。