有时候我们需要借助 nodejs 的一些包独特的性能,但是又要在 Python 环境中调用。
目前网上最流行的有三种( pyexecjs、pyv8、js2py )让 Python 调用 nodejs 的依赖库,但他们都有很大的问题,不建议使用。
乍一看作者还在维护,其实作者已经表示这个库要没了,EOL 不在维护了:
可谓是年久失修,运行简单的代码还可以苟延残喘,实测稍微带新特性的复杂脚本是运行不了的,即使 babel 做过兼容的也不行。
这个是着实很不错的,作者一直在维护,而且表示未来会兼容 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 打包可能更快,只是为了提高执行速度的一种手段,毕竟在这里编不编译只是时间问题而不是能不能执行的问题。