我已经尝试通过subprocess
python模块执行此操作,因为我知道我可以通过终端运行matlab。
我的问题:
import subprocess
myBashCommands = [] #we'll populate this list with our desired bash commands to get the smooth PSD.
myBashCommands.append("cd /Applications/MATLAB_R2018b.app/bin") #go inside matlab package
myBashCommands.append("./matlab -nodesktop") #now we're in matlab via terminal
myBashCommands.append("potato_wav = audioread('potato-us.wav')") #create the .wav
myBashCommands.append("[f, t, psd] = GetSpectrogram.m('potato_wav', 16000, 10)") #compute the spectrogram
myBashCommands.append("smooth_psd = smoothn(10*log(psd), .5)") #smooth it
myBashCommands.append("smooth_psd = SurfaceCubicInterpolator(smooth_psd)") #smooth the surface
myBashCommands.append("dlmwrite('smooth_psd.csv', smooth_psd, 'precision', ',', 'precision', '%.10f')") #overwrite or create a new .csv in the folder
subprocess.run(myBashCommands,stderr=PIPE, stdout=PIPE, shell = True, check = True) #run all of these
除成功完成的过程消息外,不返回任何内容。如果使用subprocess.call
,则会返回0,也表示成功。
同样,当我在一个新的终端窗口中单独运行所有这些bash命令时,我成功获取了.csv。
关于使用子进程动态运行时为什么不创建.csv的任何想法?我需要此文件来接收任意的.wav文件,因此这似乎是最简单的方法,无需创建某种bash脚本即可。
我正在研究信号处理,当然也正在python中工作,但是我有一些matlab代码可以执行一些重要的预处理。而不是重写python,我以为我可以做一部分...
subprocess
是一个棘手的工具。首先要注意的是,每次对subprocess.run()
的调用都将调用one