在Python中调用外部命令

在Python中调用外部命令,python,shell,command,subprocess,sox,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', '|', '

如何从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
什么是正确的

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

目前的情况是,您提供的其余参数,
'2>&1'、“|”、“sed”、“-n”、“s#RMS振幅:[^0-9]*\([0-9.]*\)$\1#p']
sox
解释为参数,因为没有外壳来解释输出重定向或管道。告诉
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.]*\)$#\1#p'")

调用函数中的参数应与命令的字符串相同

call('sed -arg1 -arg2 -argn')
另一个选项(更易于使用)是os.system(“您的原始命令”)


仅当设置了
shell=True
时,否则它会认为
sed-arg1-arg2-argn
是一个文件名中带有空格的可执行文件谢谢,现在我没有错误,但是当我运行脚本时,它不会返回任何值。操作系统(“…”)也是如此。我必须把它打印出来吗?我不知道为什么会投反对票,但没问题。不,
call
只运行程序,不返回任何输出。你需要
子进程。check_output
将进程写入
stdout
stderr
的内容写入变量。我尝试了以下方法:
output=subprocess。check_output(['ls','-1'])print'在输出中有%d个字节“%len(output)print output
,我在输出和输出中有99个字节,文件和目录的列表。然后我试着这样做:
output=subprocess.check\u output([“sox/home/pi/OnoSW/data/opsoroasistant/rec.wav-n stat 2>&1 | sed-n's#RMS振幅:[^0-9]*\([0-9.]*\)$\1#p',shell=True)print在输出中有%d个字节“%len打印输出
,我将此作为输出:
在输出中有2个字节
,但不是输出本身。对于
调用
检查输出
以及其他,您可以给出一个包含单个元素的列表,如
['ls','-1']
或一个字符串,
“ls-1”
-在第二个示例中,您有一个包含一个长字符串的列表。如果只使用字符串,而不使用列表,会发生什么?如果不使用列表,您的确切意思是什么?
import os
os.system("sox ../../data/opsoroassistant/rec.wav -n stat 2>&1 | sed -n 's#^RMS     amplitude:[^0-9]*\([0-9.]*\)$#\1#p'")