在 Node 中如何调用 Python 的方法?通常可以通过 REST 接口或者 RPC 的方式来完成,但是某些时候我们仅仅只需要调用对方几个很简单的方法,这种情况下去构建一个提供 REST 接口的服务或者两者对接实现 RPC 调用,这种做法的成本显然有点高。本文将会介绍一种更轻量的调用方式。
01
—
原理
这里轻量级的调用方式其实就是通过 command line interface 实现:
首先转换 Python 程序,使其可以通过命令行的方式调用;然后在 Node 中执行命令。这样就可以轻松的实现 Node 对 Python 的调用。
02
—
示例
示例:在 Python 中有个方法是通过 PIL(图片处理库)获取 GIF 图片的帧数,并通过 Fire( CLI 工具)将其转换为命令行接口,最后在 Node 中通过 child_process 中的 spawn 执行命令调用 Python 的方法。
1、编写 Python 程序,命名为 p.py :
PIL 和 fire 都是第三方库,可以通过 pip 或者 pipenv 安装。
通过 PIL 获取图片的 n_frames 属性即图片帧数,这对 GIF 这种 multi-frames 图片是正常的,但普通的 PNG 和 JPG 图片帧数就是一,获取其 n_frames 会抛出 AttributeError 异常,捕获处理即可。
通过 fire 将此方法转换成命令行接口,这样就可以在命令行中输入:
python3 p.py 24m.gif
即可执行 Python 中的此方法获取到图片的帧数,24m.gif 就是需要提取的图片路径。
2、在 Node 中调用:
通过 child_process 中的 spawn 执行相同的命令即可。
结语
这里其实最关键的一点就是通过 fire 去生成 Python 的命令行接口,fire 的更多用法参考官方文档即可。
对于本文中的示例提取 GIF 图片帧数,如果要在 Node 中实现,你可以通过 gm(GraphicsMagick)完成,但是效率极差,提取 24M 大小 47 帧的 GIF 图片需要二十秒,这显然无法接受,而通过 Python 的 PIL 则几乎瞬间完成。
不可否认的是 Node 和 Python 各有所长,本文介绍的通过命令行接口的轻量级调用方式,可以我们更加灵活的运用两种编程语言,更加高效的实现业务需求。