>> abcd# 执行js函数add = js2py.eval_js("function add(a, b) {return a + b};")print(add(1,2))>>> 3# 另一种方式js = js2py.EvalJs({})js.execute("js语句")骚操作一:._python执行js代码">
当前位置:   article > 正文

Python执行JS代码的三种方式

python执行js代码

1. 使用 js2py

基本操作:

  1. import js2py
  2. # 执行单行js语句
  3. js2py.eval_js("console.log(abcd)")
  4. >>> abcd
  5. # 执行js函数
  6. add = js2py.eval_js("function add(a, b) {return a + b};")
  7. print(add(1,2))
  8. >>> 3
  9. # 另一种方式
  10. js = js2py.EvalJs({})
  11. js.execute("js语句")

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

  1. # 在js代码中引入python对象
  2. context = js2py.EvalJs({'python_sum': sum})
  3. context.eval('python_sum(new Array(1,4,2,7))')
  4. >>> 14
  5. # 在js代码中加入python代码
  6. js_code = '''
  7.  var a = 10
  8.  function f(x) {return x*x}
  9. '''
  10. context.execute(js_code)
  11. context.f("14") 或 context.f(14)
  12. >>> 196

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

  1. # 转换js文件
  2. js2py.translate_file('example.js', 'example.py')
  3. # 现在可以导入example.py
  4. from example import example
  5. example.someFunction()
  1. # 转换js代码
  2. js2py.translate_js('var $ = 5')
  3. >>>
  4. """
  5. from js2py.pyjs import *
  6. # setting scope
  7. var = Scope( JS_BUILTINS )
  8. set_global_object(var)
  9. # Code follows:
  10. var.registers(['$'])
  11. var.put('$', Js(5.0))
  12. """

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

2. 使用 execjs

  1. import execjs
  2. js_code = open('file.js',encoding='utf-8').read()
  3. ctx = execjs.compile(js_code)
  4. # 第一个参数为ja代码中的函数名, 后面为函数对应的参数
  5. result = ctx.call('function_name', *args)

3. 使用subprocess调用node子进程

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

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

关于执行效率:

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/462274
推荐阅读
相关标签
  

闽ICP备14008679号