编程派本文由创业公司DeepGram的CTO Noah Shutty分享。DeepGram开放了自己的API,可以让开发者检索音频和视频文件中的语音信息。免费的开发者账号每月有40个小时的上传额度。
为什么要这样做?
Docker容器在分离不同应用方面做的非常出色,但是如果你想让这些应用之间实现交互呢?例如,你正在开发一款Python应用,而这个应用需要与一个用其他语言开发的应用进行交互。
Python官方百科中提供了一些让Python与其他流行的编程语言进行底层交互的技巧。但是如果你碰到一个很奇怪的情况,或者某个复杂的遗留软件,交互就变得非常困难,甚至是不可能完成。
我们的想法:将容器变成模块
为此,我们创建了sidomo(全称Simple Docker Module,这并不是一个AWS服务)。如果你能让那些棘手的应用在Linux环境下运行起来,你就可以通过sidomo,毫不费力地就在Python中调用这个应用。
目前很多人使用容器Docker Daemon API来管理承载着他们应用的容器。 (Kubernetes / Mesos 就是很好的例子)。 而sidomo则为容器开辟了一条全新的用例——将棘手的软件转换为好用的、原生的Python模块,可以与python程序无缝对接。
怎样使用sidomo
确保你的容器正常安装,并且运行了一个容器daemon。如果你不确定是否满足条件,可以运行 docker ps命令, 如果你得到的输出信息为 “CONTAINER ID …”,那就没问题 。假如你还不清楚怎样正确设置docker容器,你可以查看Docker官方文档或者使用谷歌搜索。
你可以用pip直接从git仓库安装sidomo。只需要在终端中输入如下命令:
Python
pip install -e 'git+https://github.com/deepgram/sidomo.git#egg=sidomo'
pipinstall -e 'git+https://github.com/deepgram/sidomo.git#egg=sidomo'
这个操作将从ubuntu基础镜像上开启一个容器,运行echo hello from ,然后运行echo the other side,然后从进程中打印输出信息。想要运行这个实例,我们需要使用shell命令将ubuntu镜像pull到你的机器。
# Get the latest Ubuntu image
docker pull ubuntu
Python
from sidomo import Containerwith Container('ubuntu') as c: for line in c.run('bash -c "echo hello from; echo the other side;"'): print(line)
from sidomoimport ContainerwithContainer('ubuntu') as c: for linein c.run('bash -c "echo hello from; echo the other side;"'): print(line)
现在我们来用sidomo做些有用的东西。FFMPEG是一个比较复杂的软件,能高效的处理媒体文件,但是在不同的平台上保持一致的安装却不容易,而且它没有最新的python包。使用sidomo,你可以把FFMPEG 安装在docker上,并用Python运行它。
shell
Python
docker pull cellofellow/ffmpeg
dockerpullcellofellow/ffmpeg
Python
Python
from sidomo import Container
from sidomoimport Container
url =’ http://www2.warwick.ac.uk/fac/soc/sociology/staff/sfuller/media/audio/9_minutes_on_epistemology.mp3′
with Container(
Python
'cellofellow/ffmpeg', stdout=False) as c: for line in c.run(
'cellofellow/ffmpeg', stdout=False) as c: for linein c.run(
‘bash -c /”/
wget -nv -O tmp.unconverted %s;/
ffmpeg -i tmp.unconverted -f wav -acodec pcm_s16le -ac 1 -ar 16000 tmp.wav;/
cat tmp.wav/
/”/
‘ % url
):
Python
print line
print line
下面的例子将从一个URL抓取音频,将其转码,并打印调试信息以证明它运行成功。我们禁用这个进程的标准输出,因为我们只需要看到调试信息。
如果你需要将此程序转码后的音频数据保存起来,你可以将stdouy=False这一行替换成stderr=False,然后确保将容器进程输出的每一行(裸音频数据)写到文件中。
有趣的可能性
如果你不得不为一些复杂的软件编写Python包,可以考虑将这个软件容器化。通过sidomo,可以毫不费力地将一个容器化的应用变成Python模块。
如果你发现自己经常使用subprocess与一些没有Python包的代码进行交互,那么容器化会使交互更加简单。
如果使用了sidomo的Python应用最后出现了复杂的依赖关系,你或许可以把应用包装一个单独的容器中,然后从外部调用这个应用,这样可以减少依赖关系。sidomo也支持这个功能,因为Docker是可以实现嵌套容器的。你可以使用sidomo不断地导入一层又一层容器,从而创建一个自己的软件俄罗斯套娃。
祝你好运!请记住,你不能无限制地使用容器化来降低复杂度。对吗?
译文参考了开源中国上的版本,并在其基础进行了精校和改善。
原文链接: http://blog.deepgram.com/import-a-docker-container-in-python/