在 Python 中导入一个 Docker 容器

发布于 2025-01-10 23:05:51 字数 4465 浏览 7 评论 0

为什么要这样做?

Docker 容器对于应用之间彼此隔离是非常棒的,但如果你想要它们之间彼此通信呢?例如,如果你正在用 Python 开发一个应用,而这个应用需要与其他语言编写的软件进行交互。有 一些技巧 可以用来实现 Python 与其他流行语言之间低级别的互操作。但是如果你处于一种 奇怪的情况 ,或使用一些复杂的传统软件,这将变得困难,甚至是不可能的。

想法:作为模块的容器

我们创建了 sidomo - 简单的 Docker 模块 *,这样,如果你让你奇怪的应用程序在任何 linux 环境上运行,那么你可以立即以零添加的形式从 Python 中调用它。

现在,大多数人使用 Docker Daemon API 来管理执行他们应用程序的容器。( Kubernetes / Mesos 是这方面很好的例子)。Sidomo 为容器开辟了一个全新的用例 —— 将奇怪的软件转换成在 Python 代码中无缝运行的漂亮且单纯的 Python 模块。

*并不是一个 AWS 服务

如何使用 sidomo

请确保你安装了 Docker,并且运行了一个 Docker 守护进程。如果你不确定是否是这样,那么运行 docker ps ,然后看看是否获得"CONTAINER ID ..."输出。如果你不确定如何正确设置 Docker,那么你可以看看 这个链接 或者 搜索这里 来查找对应的方法。

设置 Sidomo: 单行方式

你可以使用 pip 直接从 git 仓库中安装 sidomo。只需在你的 shell 中运行下面这个命令:

pip install -e 'git+ https://github.com/deepgram/sidomo.git#egg=sidomo' 

例子:一个简单的 Hello World

这将从 Ubuntu 基本镜像中启动一个容器,运行 echo hello from ,然后运行 echo the other side ,然后从该过程中打印输出行。要为这个例子做准备,你需要使用一个 shell 命令将 Ubuntu 镜像拉到你的机器上。

shell

# Get the latest Ubuntu image
docker pull ubuntu

Python

from sidomo import Container

with Container('ubuntu') as c:  
    for line in c.run('bash -c "echo hello from; echo the other side;"'):
        print(line)

例子:使用 sidomo 处理 FFMPEG

现在,让我们用 sidomo 实际做一些有用的东西。 FFMPEG 是一个比较复杂的软件,对于大多数用途,它可以有效地操纵媒体文件,但是,它不容易在不同平台上进行一致的安装,并且没有最新的 Python 绑定它。使用 Sidomo,你可以用 Docker 拉取 FFMPEG,并且轻松地从 Python 运行它。

shell

docker pull cellofellow/ffmpeg

Python

下面的例子将从 URL 中抓取音频,对其进行转码,并打印调试信息来证明其有效。该进程的标准输出(原始音频输出)被禁用了,因为我们只希望看到调试信息。

from sidomo import Container  
url = 'http://www2.warwick.ac.uk/fac/soc/sociology/staff/sfuller/media/audio/9_minutes_on_epistemology.mp3'  
with Container(  
    'cellofellow/ffmpeg',
    stdout=False
) as c:
    for line in 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
    ):
        print line

如果你确实想在这个进程中保存转码后的音频,那么你可以用 stderr=False 替换 stdout=False 行,然后确保将容器进程中的每一行输出(原始音频数据)写到一个文件中。

乐享未来

如果你必须为一些复杂的软件编写 Python 绑定,那么可以考虑容器化软件来代替。使用 sidomo 把一个容器化的应用程序转换成一个 Python 模块是不费劲的,并且是干净的。

如果你发现对于那些不存在合适的绑定的进程,你自己经常使用子进程与代码进行交互,那么容器化这些过程可能会让一些事情变得更简单。

如果你在这样的一个 Python 应用中使用 sidomo —— 它以开发了复杂依赖告终 —— 那么你可能需要将它包装在自己的容器中,并在外面从一个具有较少依赖的应用程序调用它。Sidomo 也支持这样做,因为 docker 支持嵌套容器 。你可以通过使用 sidomo 导入 sidomo 导入 sidomo 来做自己的软件俄罗斯套娃....

祝你好运!只要记住,你不能无限期地容器化复杂度。或者,你可以?

在 github 上的 Sidomo

为什么我们做这个?

我们创建了 DeepGram API,一个用于音频和视频的搜索引擎,它使得语音可搜索。DeepGram 使用一个信号处理的复杂堆栈,统计和机器学习的软件协同工作,以提供一个无缝的“上传和搜索”体验。Sidomo 让我们迅速地容器化挑剔的软件,并将其与 Python,我们的胶水,整合在一起。

你可以在 www.deepgram.com 上获得一个带有 API 访问权限的帐户。该帐户每月可以进行 40 小时免费上传(这个很长的路要走!)。来看看吧,让我们知道 你在想些什么

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

审判长

暂无简介

文章
评论
25 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文