在python程序中调用 JS 代码
在python程序中调用 JS 代码
如何 在python程序中调用 JS 代码
Node.js
直接通过OS popen 执行命令,需要有Node环境
import os
# node 环境
# test.js 待执行的JS的文件
# %s %s 传递给JS文件的参数
a = os.popen('node test.js %s %s' % (1, 2)) # 执行shell命令,拿到输出结果
# print(a.readlines())
b = a.read() # 取出执行结果
print(b)
// test.js
function add(x, y) {
return x + y;
}
// process.argv 传递给JS的参数 [nodePath,jsPath,arg1,arg2,...]
var arg1 = process.argv[2]; // 解析出JS参数
var arg2 = process.argv[3];
console.log(add(arg1, arg2)); // 执行函数,并打印结果
PyExecJs
这个库主要是将 JS 代码运行在本地的 JS 环境中,优点是我们有多种 JS 环境的选择,官方推荐了 PyV8、Node.js、PhantomJS、Nashorn 四种,当然缺点是必须安装一种环境导致不是很轻量,而且调用时有一个启动环境过程,还是有明显缓慢的。
安装 pip install PyExecJS
, 环境推荐使用 Node.js
demo
import execjs
date = execjs.eval("new Date") # execjs.eval,执行JS代码
print(date)
执行JS函数
import execjs
ctx = execjs.compile("""
function add(x, y) {
return x + y;
}
""")
res = ctx.call('add', 1, 2)
print(res)
可执行execjs的环境
PyV8 = "PyV8"
Node = "Node"
JavaScriptCore = "JavaScriptCore"
SpiderMonkey = "SpiderMonkey"
JScript = "JScript"
PhantomJS = "PhantomJS"
SlimerJS = "SlimerJS"
Nashorn = "Nashorn"
环境切换
import execjs
import os
# 1. 通过os.environ
os.environ["EXECJS_RUNTIME"] = "Node"
print(execjs.get().name)
execjs.eval("1 + 2")
# 2. 通过execjs.get 切换
# runtime_names 便是execjs源码中给出的执行环境的。 execjs.runtime_names.xxx xxx必须是 可执行execjs的环境
jscript = execjs.get(execjs.runtime_names.JScript)
print(jscript.name)
jscript.eval("1 + 2")
PyV8
这是 Google 官方将 Chrome V8 引擎用 Python 封装的库,和 PyExecJS
相比,这个库很轻量,不需要额外装 JS 环境,因为 V8 本身就是环境,同时也因为不需要启动外部环境,执行速度很快。
官方 https://code.google.com/archive/p/pyv8/downloads
安装,由于只有2.X版本的,3.X版本安装就妙不可言,测试多次未安装成功。。。
todo 待安装测试
测试 demo
import PyV8 # 注意大小写
with PyV8.JSContext() as ctx:
ctx.eval("""
function add(x, y) {
return x + y;
}
""")
ctx.locals.add(1, 2)