Python调用nodejs现在建议的方法(弃用pyexecjs、pyv8、js2py)

前言

有时候我们需要借助 nodejs 的一些包独特的性能,但是又要在 Python 环境中调用。

目前网上最流行的有三种( pyexecjs、pyv8、js2py )让 Python 调用 nodejs 的依赖库,但他们都有很大的问题,不建议使用。

不建议的原因

pyexecjs

Python调用nodejs现在建议的方法(弃用pyexecjs、pyv8、js2py)_第1张图片
乍一看作者还在维护,其实作者已经表示这个库要没了,EOL 不在维护了:
Python调用nodejs现在建议的方法(弃用pyexecjs、pyv8、js2py)_第2张图片
可谓是年久失修,运行简单的代码还可以苟延残喘,实测稍微带新特性的复杂脚本是运行不了的,即使 babel 做过兼容的也不行。

pyv8

pyv8 更可怕,都是上古存档,直接放弃。
Python调用nodejs现在建议的方法(弃用pyexecjs、pyv8、js2py)_第3张图片

js2py

在这里插入图片描述
这个是着实很不错的,作者一直在维护,而且表示未来会兼容 es6(目前只兼容 es5 )

但是他在 Windows 上运行有巨大的 bug ,底层执行 shell 的时候会报错:

Could not link required node_modules

我们可以在 issue#125 里翻到 2018 年的一个解决方案,但是仍然执行失败,因为他默认还要安装 babel 系列组件,再用 babel 编译一遍,更难受的是这些组件是已经淘汰的 babel 7 之前的依赖。

也就是说,要执行新特性和复杂一点的脚本,这个库我们也用不了。

建议方法

经过探索之后,建议直接用命令行执行,简单有效:

import os
os.system('node script.js')

那又一个问题来了,这样执行效率很低(当然比 js2py 高,js2py 就算能跑起来也要很久去处理兼容问题和安装依赖,花费极其大量的时间),我们使用 babel 7 做一个处理:

安装 babel 7 依赖:

yarn add @babel/core @babel/cli @babel/preset-env -D
yarn add @babel/polyfill core-js@3

配置 babel 的 babel.config.json 文件:

{
  "presets": [
    [
      "@babel/env",
      {
        "useBuiltIns": "usage",
		"corejs": { "version": 3, "proposals": true }
      }
    ]
  ]
}

执行编译:

yarn run babel script.js -o scriptOut.js

细心的人可能会发现 7.4 之后不推荐使用 @babel/polyfill 了,但是使用外置 corejs 依赖是可以的,详见:

《babel7.4之后babel/polyfill是否继续使用和怎么用的问题》

之后测试一下速度:

time_start=time.time()
os.system('node script.js')
time_end=time.time()
print('totally cost: ',time_end-time_start)

最终发现经过 babel 编译的明显速度加快,而且较稳定。

总结

不是说一定要用 babel 编译,如果 webpack 打包可能更快,只是为了提高执行速度的一种手段,毕竟在这里编不编译只是时间问题而不是能不能执行的问题。

你可能感兴趣的:(Python,python,nodejs,pyexecjs,pyv8,js2py)