在Python中调用外部命令

时间:2016-06-01 10:33:42

标签: python shell command subprocess sox

如何从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.]*\)$#\1#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.]*\)$#\1#p'

我明白了:

0.001754

什么是正确的。

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您还可以使用os.system

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

答案 2 :(得分:0)

另一种选择(更容易使用)是os.system('你的原始命令')

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

答案 3 :(得分:-2)

call函数中的参数应该与命令在同一个字符串中。

call('sed -arg1 -arg2 -argn')
相关问题