在Python中从shell命令获取stdout的问题

时间:2018-04-13 04:15:11

标签: bash python-3.x scripting stdout python-2.x

我有一行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(),将所有混乱插入列表,将stdout设置为pipe,将stderr和stdin设置为DEVNULL

  • x设置为subprocess.check_output(),再次传入整行代码。

  • x设置为等于run()的输出

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

我尝试的一切都会给我:

  • 只是0

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

  • 没有

如何以字符串格式将我想要的数据传递给x变量?这一直困扰着我几天,没有任何帮助。如果我需要使用Python 3,即使我更喜欢使用Python 2.

谢谢大家的帮助!如果您需要更多信息,请询问,我很乐意将它们编辑到这里的问题中供所有人查看。

再次感谢你!

1 个答案:

答案 0 :(得分:0)

关于如何在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会将字符串解释为单个命令,而不是管道。