注意 需要安装好node.js, 并添加好环境变量!!!
pip install pyevaljs3
import pyevaljs3
js_code = "function f(args) {console.log(args); return 'ok';}; return f('args')"
result = pyevaljs3.eval_(js_code)
print(result) # 'ok'
js_code = "function f(arg1, arg2) {console.log(arg1, arg2); return arg1 + arg2;}"
ctx = pyevaljs3.compile_(js_code)
result = ctx.call('f', 'a', 'b')
print(result) # 'ab'
#另一钟传参方式
result = ctx.call('f', arg_list=['a', 'b'])
print(result) # 'ab'
# 调用js异步函数
js_code = "async function f(arg1, arg2) {console.log(arg1, arg2); return arg1 + arg2;}"
ctx = pyevaljs3.compile_(js_code)
async def main():
result = await ctx.async_call('f', "a", "b", async_js_func=True)
return result
import asyncio
result = asyncio.run(main())
print(result) # 'ab'pyevaljs3.JSEval
-
def compile(self, source: str = None, suffix: str = None):
编译javascript源代码
:param source: 源代码字符串或要读取的文件路径
:param suffix: js脚本文件名后缀(指定以什么模式执行), 默认是".js", 可选的值还有".cjs", ".mjs"等
:return: Context -
def eval(self, code: str = None, ignore_output=False):
执行javascript代码, 返回其结果 -
async def async_eval(self, code: str = None, ignore_output=False):
执行javascript代码, 返回其结果(异步版本的eval)
pyevaljs3.Context
-
def call(self, func, *args, arg_list: List = None):
调用指定的函数, 返回其结果(若指定了arg_list, 优先使用它作为函数参数)
:param func: 函数名
:param args: 函数的参数列表
:param arg_list: 函数的参数列表 -
async def async_call(self, func, *args, arg_list: List = None, async_js_func: bool = False):
调用指定的函数, 返回其结果(若指定了arg_list, 优先使用它作为函数参数), 参数解释同call
:param async_js_func: 调用的js函数是否是异步js函数
pyevaljs3的模块级函数
-
def compile_(source: str = None, mode: str = None) -> Context:
编译js源代码
:param source: 源代码字符串或要读取的文件路径
:param mode: 执行模式, 默认以.js的行为去执行
:return: Context -
def eval_(code: str = None, ignore_output=False):
执行javascript代码, 返回其结果
:param code: js代码
:param ignore_output: 是否忽略执行过程中的输出, 若为True则仅返回其结果, 默认不忽略(False) -
async def async_eval(code: str = None, ignore_output=False):
执行javascript代码, 返回其结果, 参数解释同eval_, 异步版本的eval_
- 通过设置坏境变量来使用自定义版本的node, 只需设置NODE_PATH、NODE坏境变量即可
import os
# 优先级最高
os.environ['NODE_PATH'] = '/path/to/node.exe'
# 或者
# 优先级其次
os.environ['NODE'] = '/path/to/node.exe'