在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)

参考

爬虫必备:Python 执行 JS 代码 —— PyExecJS、PyV8、Js2Py

Python爬虫杂记 - python运行js

posted @ 2019-08-11 16:28  写bug的日子  阅读(2599)  评论(0编辑  收藏  举报