在 Python 中调用外部命令

Call an external command in Python

如何从 Python 脚本中调用外部命令(就像我在 Unix shell 中输入的一样)?

我试过这段代码:

from subprocess import call
call(["ls", "-l"])

并且有效。 但是当我在 Python 脚本中尝试此代码时:

from subprocess import call
call(['sox', '/home/pi/OnoSW/data/opsoroassistant/rec.wav', '-n', 'stat', '2>&1', '|', 'sed', '-n', 's#^RMS     amplitude:[^0-9]*\([0-9.]*\)$##p'])

没用。我收到此错误:

 sudo python getRMSAmplitude.py sox FAIL stat: Summary effect: unknown option

当我在我的 Unix Shell 中键入此命令时:

sox ../../data/opsoroassistant/rec.wav -n stat 2>&1 | sed -n 's#^RMS     amplitude:[^0-9]*\([0-9.]*\)$##p'

我得到:

0.001754

正确的是

call([...], shell=True)

目前发生的情况是,您提供的其余参数 '2>&1', '|', 'sed', '-n', 's#^RMS amplitude:[^0-9]*\([0-9.]*\)$##p']sox 解释为参数,因为没有 shell解释输出重定向或管道。告诉 call 使用 shell,它的解释方式与您的命令行相同。

你也可以使用os.system:

import os
os.system("sox ../../data/opsoroassistant/rec.wav -n stat 2>&1 | sed -n 's#^RMS     amplitude:[^0-9]*\([0-9.]*\)$##p'")

调用函数中的参数应与命令在同一字符串中。

call('sed -arg1 -arg2 -argn')

另一个选项(更易于使用)是 os.system('your original command')

import os
os.system("sox ../../data/opsoroassistant/rec.wav -n stat 2>&1 | sed -n 's#^RMS     amplitude:[^0-9]*\([0-9.]*\)$##p'")