Python执行JS代码的三种方式

1. 使用 js2py

基本操作:

import js2py


# 执行单行js语句
js2py.eval_js("console.log(abcd)")
>>> abcd

# 执行js函数
add = js2py.eval_js("function add(a, b) {return a + b};")
print(add(1,2))
>>> 3

# 另一种方式
js = js2py.EvalJs({})
js.execute("js语句")

骚操作一: 在js代码中引入python对象 或 python代码

# 在js代码中引入python对象
context = js2py.EvalJs({'python_sum': sum})
context.eval('python_sum(new Array(1,4,2,7))')
>>> 14

# 在js代码中加入python代码
js_code = '''
 var a = 10
 function f(x) {return x*x}
'''
context.execute(js_code)
context.f("14") 或 context.f(14)
>>> 196

骚操作二: 将js代码转为python模块,再使用import 导入

# 转换js文件
js2py.translate_file('example.js', 'example.py')

# 现在可以导入example.py
from example import example
example.someFunction()
# 转换js代码
js2py.translate_js('var $ = 5')
>>> 
"""
from js2py.pyjs import *
# setting scope
var = Scope( JS_BUILTINS )
set_global_object(var)

# Code follows:
var.registers(['$'])
var.put('$', Js(5.0))
"""

详见:https://github.com/PiotrDabkowski/Js2Py

2. 使用 execjs

import execjs

js_code = open('file.js',encoding='utf-8').read()
ctx = execjs.compile(js_code)

# 第一个参数为ja代码中的函数名, 后面为函数对应的参数
result = ctx.call('function_name', *args)

3. 使用subprocess调用node子进程

前面两种只适合执行少量js代码的情况,当有大量js代码要执行时,还是建议直接调用node

import subprocess

# js文件最后必须有输出,我使用的是 console.log
pro = subprocess.run("node abc.js", stdout=subprocess.PIPE)
# 获得标准输出
_token = pro.stdout
# 转一下格式
token = _token.decode().strip()

关于执行效率:

py2js有时候在加载一些加密函数的时候效率低的可怜,大概是因为执行机制的不同:

py2js直接调用的nodejs引擎不过这个库用的nodejs解析语法树转成py代码,性能挺低的,还不如直接用execjs调nodejs或自己封装子进程调用;execjs调用的pyv8,不过默认的pyv8的引擎挺老的,es5好多特征都不支持

  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值