PyExecJS 提供了 Javascript 的运行环境,可以让 Python 执行 Javascript 代码

下载

1
$ pip install PyExecJS

例子

这是一个官方的例子

1
2
3
4
5
6
7
8
9
10
>>> import execjs
>>> execjs.eval("'red yellow blue'.split(' ')")
['red', 'yellow', 'blue']
>>> ctx = execjs.compile("""
function add(x, y) {
return x + y;
}
""")
>>> ctx.call("add", 1, 2)
3

使用起来很简单,自己编写方法时,只需要先编译就可以直接调用自定义函数。

不过单纯的调用 JS 的场景并不多,只是这样的话,还不如直接写 Python 代码,更有用
处的是在 Node 环境中

调用 Node

假设我有一个压缩 JS 的工具要实现,我又不想单独搞一套 Node 的线上环境,这时候我
们就可以直接在 Python 中调用。

首先由 index.js 文件实现功能

1
2
3
4
5
var uglifyjs = require('uglify-js');

const test = (text) => {
return uglifyjs.minify(text);
}

接着创建 Python 文件 app.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: wxnacy([email protected])

import os
import execjs
import json

os.environ["EXECJS_RUNTIME"] = "Node"
os.environ["NODE_PATH"] = os.getcwd()+"/node_modules"

f = open(os.getcwd() + "/index.js")
text = f.read()
parser = execjs.compile(text)

if __name__ == "__main__":
obj = parser.call("test", 'function add(first, second) { return first + second; }')
print(obj) # {'code': 'function add(n,d){return n+d}'}

执行 app.py 即可

在上面的例子中

1
2
os.environ["EXECJS_RUNTIME"] = "Node"
os.environ["NODE_PATH"] = os.getcwd()+"/node_modules"

这两行起到关键作用,指明 runtime 为 Node,并将 node_modules 目录加入到环境
变量中,其他操作就都跟 JS 一样了。
上述例子完成 DEMO 在 GitHub

03-16 22:08