解决Python使用execjs执行JS文件中的UnicodeDecodeError报错

文章讲述了在使用Python执行JavaScript文件时遇到的UnicodeDecodeError,通过在导入execjs模块前设置Popen的encoding为utf-8,解决了因系统默认编码导致的编码问题。

问题描述:

最近在使用Python执行JS文件时,遇到了一个报错:“ UnicodeDecodeError: 'gbk' codec can't decode byte 0xa8 in position 34: illegal multibyte sequence”。尽管已经在打开文件时指定了编码格式为utf-8: js_code = open("get_m.js", mode="r", encoding="utf-8").read() ,但问题仍然存在。

问题解决:

回想起之前解决中文乱码问题的经验,我考虑到可能是在导入execjs模块之前,系统对编码格式进行了默认设置,导致了这个报错。因此,我决定在导入execjs模块之前,强制指定Popen的编码格式为utf-8。

解决方式:

在代码文件的开头加入以下内容:

import subprocess
from functools import partial  # 用来固定某个参数的固定值

subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')
# 解决execjs执行js时产生的乱码报错,需要在导入execjs模块之前,让Popen的encoding参数锁定为utf-8
import execjs

通过这样的修改,成功解决了执行JS文件时出现的UnicodeDecodeError报错,虽然具体原因尚不清楚,但这个方法有效地解决了问题。

使用 Python 的 `execjs` 库调用 JavaScript 文件时,若出现编码错误,通常是因为 `execjs` 在 Windows 系统下默认使用 `gbk` 编码读取 JavaScript 文件内容,而 JavaScript 文件本身可能采用的是 `utf-8` 编码,导致解码失败[^3]。此类错误的典型表现为 `UnicodeDecodeError`,例如: ``` UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 22: illegal multibyte sequence ``` 为了解决这一问题,可以采取以下几种方式: ### 1. 修改 `subprocess.Popen` 的默认编码方式 在导入 `execjs` 前,通过修改 `subprocess.Popen` 的默认编码为 `utf-8`,可以绕过系统默认编码带来的解码问题。具体代码如下: ```python import subprocess from functools import partial subprocess.Popen = partial(subprocess.Popen, encoding="utf-8") ``` 随后再导入 `execjs`,即可避免编码错误[^2]。 ### 2. 显式指定文件读取时的编码格式 在读取 JavaScript 文件内容时,应显式指定使用 `utf-8` 编码打开文件,确保内容正确解码。例如: ```python with open("script.js", "r", encoding="utf-8") as f: js_code = f.read() ``` 这种方式能够有效避免因系统默认编码不一致(如 Windows 下为 `gbk`)而导致的解码失败问题[^1]。 ### 3. 使用 `execjs.compile()` 编译 JavaScript 代码 在调用 JavaScript 函数之前,必须先通过 `execjs.compile()` 方法将 JavaScript 代码编译为可执行上下文对象,再通过该对象调用 `.call()` 方法执行函数。例如: ```python import execjs with open("script.js", "r", encoding="utf-8") as f: js_code = f.read() ctx = execjs.compile(js_code) result = ctx.call("testFunc") print(result) ``` 这样可以确保代码在执行过程中不会因类型错误(如字符串对象无 `.call()` 方法)而失败[^1]。 ### 4. 确保 JavaScript 函数返回有效值 在 JavaScript 函数中,应确保有明确的 `return` 语句返回有效值,以避免因返回 `None` 而引发后续处理中的 `AttributeError`。例如: ```javascript function testFunc() { return "Hello from JS"; } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

d0ublecl1ck_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值