如何从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
什么是正确的。
答案 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')