Python调用nodejs现在建议的方法(弃用pyexecjs、pyv8、js2py) | 您所在的位置:网站首页 › oloey是什么牌子手表 › Python调用nodejs现在建议的方法(弃用pyexecjs、pyv8、js2py) |
前言
有时候我们需要借助 nodejs 的一些包独特的性能,但是又要在 Python 环境中调用。 目前网上最流行的有三种( pyexecjs、pyv8、js2py )让 Python 调用 nodejs 的依赖库,但他们都有很大的问题,不建议使用。 不建议的原因 pyexecjs乍一看作者还在维护,其实作者已经表示这个库要没了,EOL 不在维护了: 可谓是年久失修,运行简单的代码还可以苟延残喘,实测稍微带新特性的复杂脚本是运行不了的,即使 babel 做过兼容的也不行。 pyv8pyv8 更可怕,都是上古存档,直接放弃。 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 打包可能更快,只是为了提高执行速度的一种手段,毕竟在这里编不编译只是时间问题而不是能不能执行的问题。 |
CopyRight 2018-2019 实验室设备网 版权所有 |