如何在Python中调用终端命令,并在同一脚本中从RAM中检索结果文件?

如何在Python中调用终端命令,并在同一脚本中从RAM中检索结果文件?,python,linux,subprocess,multiprocessing,mkfifo,Python,Linux,Subprocess,Multiprocessing,Mkfifo,我试图在Linux中使用soxterminal包创建一个光谱图png,并使用Python在GUI中显示它。由于我需要使用一系列图像,我最终计划在多处理.Manager|Queue上下文中实现这一点。 终端命令是: :~$ sox sound.wav -n trim 42 6 rate 30k spectrogram -q 8 -r -l -m -o spectrogram.png 我可以在Python(3.4)脚本中使用 import subprocess path= 'spectrogram

我试图在Linux中使用
sox
terminal包创建一个光谱图png,并使用Python在GUI中显示它。由于我需要使用一系列图像,我最终计划在
多处理.Manager|Queue
上下文中实现这一点。
终端命令是:

:~$ sox sound.wav -n trim 42 6 rate 30k spectrogram -q 8 -r -l -m -o spectrogram.png
我可以在Python(3.4)脚本中使用

import subprocess
path= 'spectrogram.png'

process = 'sox sound.wav -n trim 42 6 rate 30k spectrogram -q 8 -r -l -m -o {}'.format(path)
subprocess.call(process, shell=True)
但是(为了在Raspberry Pi上加快速度),我不希望保存到磁盘,然后重新加载GUI

我尝试使用
mkfifo
,例如:

import subprocess
import os    
path= '/tmp/spectrogram.png'
os.mkfifo(path)        
process = 'sox sound.wav -n trim 42 6 rate 30k spectrogram -q 8 -r -l -m -o {}'.format(path)
subprocess.call(process, shell=True)
都失败了吗(阻塞,大概是因为我只使用了一个进程?)

我发现的示例都集中在单独的服务器/接收器进程和/或处理终端输出(例如使用stdout),而不是命令行进程创建的文件


由于没有Python方面的经验(也是命令行方面的新手),我感觉自己“找错了方向”,但我不知道下一步该去哪里看

我对sox一无所知,但显然有一个Python包装器,-这会有帮助吗?@Daniel Roseman:thx Daniel,我来看看。但是,如果它只是一个包装器,它仍然只输出到磁盘文件,我会想象您使用的是什么版本的
sox
sox--version
)?如果它是最新的(),您可以将光谱图输出重定向到标准输出,并直接在Python中获取它,而无需写入文件。
14.4.1
不支持将光谱图写入标准输出,因此您需要从中保存一个文件,然后将其加载到Python中—这并不是那么糟糕,请注意,性能方面—毕竟,如果您想将其转换为多进程代码,那么仅使用文件系统I/O可能比pickle/unpickle交换的数据(在进程之间交换数据时的默认Python行为)更快@cate-在单个进程设置中,不会涉及pickle,因为您将直接从标准输出读取数据。但是,如果您的子进程要这样做,然后将PNG数据发送回主进程,那么是的,通过避免文件I/O,您可能会减少任何性能节省。您可以尝试通过创建一个ramdisk并使sox写入并从中读取Python来加快文件I/O。我对sox一无所知,但显然有一个Python包装器,-这会有帮助吗?@Daniel Roseman:thx Daniel,我来看看。但是,如果它只是一个包装器,它仍然只输出到磁盘文件,我会想象您使用的是什么版本的
sox
sox--version
)?如果它是最新的(),您可以将光谱图输出重定向到标准输出,并直接在Python中获取它,而无需写入文件。
14.4.1
不支持将光谱图写入标准输出,因此您需要从中保存一个文件,然后将其加载到Python中—这并不是那么糟糕,请注意,性能方面—毕竟,如果您想将其转换为多进程代码,那么仅使用文件系统I/O可能比pickle/unpickle交换的数据(在进程之间交换数据时的默认Python行为)更快@cate-在单个进程设置中,不会涉及pickle,因为您将直接从标准输出读取数据。但是,如果您的子进程要这样做,然后将PNG数据发送回主进程,那么是的,通过避免文件I/O,您可能会减少任何性能节省。您可以尝试通过创建一个ramdisk并使sox写入并从中读取Python来加快文件I/O的速度。