Python调用js,Python执行js,pyexecjs2使用方法

本文介绍了如何在Python中安装并使用已停止更新的PyExecJS库,解决可能遇到的编码问题,推荐将JavaScript代码存储在单独文件中便于调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        安装

pip install PyExecJS2

        pyexecjs一代已经停止更新,可能会出现编码问题。

        使用方法:

	import execjs
	
	jsstr = '''
	function add() {
	    let a = 1;
	    let b = 2;
	    return a+b;
	}'''
	js = execjs.compile(jsstr)
	result = js.call('add')
	# call 里面的参数第一个是js函数名称, 如果要执行的js有参数, 后面跟上参数就可以
	# 如js.call('add', 2, 3)
	print(result)

        最好将js代码单独放入js文件中,方便js代码的调试,需要在python中使用时通过文件读取js文件内容即可。

### 如何使用 PyExecJS 调用 JavaScript 函数 PyExecJS 是一个用于在 Python 中运行 JavaScript 的库。它允许开发者通过不同的 JavaScript 运行环境(如 Node.js 或其他 JS 解析器)来执行 JavaScript 代码并获取返回值。 以下是关于如何使用 PyExecJS调用 JavaScript 函数的具体说明以及示例代码: #### 安装依赖 为了能够正常运行 PyExecJS,需要先安装该库及其所需的 JavaScript 运行时环境。可以通过 `pip` 命令安装 PyExecJS 库: ```bash pip install pyexecjs ``` 此外,还需要确保本地已安装至少一种可用的 JavaScript 运行环境,比如 Node.js。如果未安装,则可以访问官方文档下载并配置合适的版本[^1]。 #### 使用 PyExecJS 调用简单函数 下面是一个简单的例子展示如何利用 PyExecJS 编译一段 JavaScript调用其内部定义好的函数: ```python import execjs # 创建上下文对象 (默认尝试自动检测最佳引擎) ctx = execjs.compile(""" function multiply(x, y) { return x * y; } """) # 调用编写的 js 方法 'multiply' result = ctx.call("multiply", 7, 8) print(f"The result of multiplying is {result}") # 输出结果应为56. ``` 上述脚本首先创建了一个包含单个名为 `multiply` 的函数字符串形式的 JavaScript 上下文实例;接着借助此上下文中提供的 `.call()` 方法传入参数实际调用了对应的 JavaScript 函数,并最终打印出了计算所得乘积的结果[^3]。 #### 处理更复杂的场景——异步函数的支持 当涉及到更加复杂的情况,特别是现代 Web 开发中常见的基于 Promise 和 async/await 构建起来的异步逻辑时,由于标准版 ExecJS 不直接支持这些特性,因此推荐改用 subprocess 结合外部 node 工具链的方式来完成任务。 这里给出另一个案例演示怎样配合 Node 实现对带有延迟效果模拟网络请求行为的异步方法的有效调用过程: 假设我们有如下待测试的目标 Js 文件 content.js : ```javascript //content.js async function fetchData() { const promise = new Promise((resolve)=>{ setTimeout(() => resolve('data'), 200); }); let data = await promise; console.log(`Fetched ${data}`); return data; } module.exports = {fetchData}; ``` 那么相应的 python 驱动程序可设计成这样子的形式: ```python import json from subprocess import Popen, PIPE def run_js_function(js_file_path, func_name): process = Popen(['node', '-e', f'const {{ {func_name} }} = require("{js_file_path}"); ' f'{func_name}().then(res=>console.log(JSON.stringify({{res}})))'], stdout=PIPE, stderr=PIPE) output, error = process.communicate() if not error: parsed_output = json.loads(output.decode()) return parsed_output['res'] else: raise RuntimeError(error) if __name__ == '__main__': path_to_script = './path/to/content.js' fetched_data = run_js_function(path_to_script , 'fetchData') print(f"Fetched Data from Async Function: '{fetched_data}'") ``` 在这个方案里,我们将原本难以被纯同步接口驱动的异步流程交给了专门擅长处理此类事务的 NodeJs 引擎去负责解析与管理,而自己只需要关注于接收最后成型的数据即可。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值