python执行js代码
一. 下载
# 下载:
pip3 install PyExecJS
# 注意: 使用execjs必须下载node.js程序,它是js代码运行所依赖的环境
二. 方法介绍
eval()
输入参数:source(JS语句)、cwd(路径)
返回值:result(语句执行结果)
compile()
输入参数:source(JS语句)、cwd(路径)
返回值:编译后的对象
call()
输入参数:name(要调用的JS方法名称)、*args(方法所需要的参数,可多个)
返回值:result(运行方法的返回结果)
三. 基本使用: 执行函数和获取变量
test.js
// 函数
function func(name, age) {
return `name:${name}. age:${age}`
}
// 变量
let name = "12353454";
test.py
import execjs
# open后跟所执行的js文件位置,call后第一个单引号引起来的为所执行的js文件的某个function,
with open('test.js', 'r', encoding='utf-8') as f:
docjs = execjs.compile(f.read())
res = docjs.call('func', 'yang', 18)
print(res) # name:yang. age:18
res = docjs.eval('name')
print(res) # 12353454
四. 进阶使用: 加载window对象
# 下载:
cnpm install jsdom
test.js
// 声明模拟浏览器环境
const jsdom = require("jsdom");
const {JSDOM} = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
window = dom.window;
document = window.document;
XMLHttpRequest = window.XMLHttpRequest;
let browserName = window.navigator.userAgent;
test.py
import execjs
with open('test.js', 'r', encoding='utf-8') as f:
docjs = execjs.compile(f.read())
res = docjs.eval('browserName')
print(res) # Mozilla/5.0 (win32) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/16.4.0
# 注意:
'''
如果python环境中没有window对象, 需要下载jsdom. 并在.js文件头部声明.
如果没有声明将会抛出异常: execjs._exceptions.ProgramError: ReferenceError: window is not defined
'''