问题描述
在使用python环境调用execjs包执行js代码时,可能会发生报错“UnicodeEncodeError: 'gbk' codec can't encode character '\x..' in posit”
import execjs
with open('1_js.js', 'r', encoding='utf-8') as f:
jscode = f.read()
ctx = execjs.compile(jscode)
m = ctx.call('request')
问题归因
execjs库的执行逻辑为: execjs库的底层通过Popen函数来调用nodejs环境来运行JavaScript代码,相当于在cmd命令框中输入node xxx.js来执行。windows系统的cmd命令框默认是gbk编码,但是在pycharm中设置的默认编码为utf-8,所以就会出现两边编码不一致导致的解码问题。
解决方案
解决上述问题的方案为:只需要把Popen的字符集设置成utf-8即可,但这个必须在引入execjs库之前就锁定Popen的字符集。 具体做法如下: 在引入execjs库之前,加入如下代码即可:
from functools import partial # 锁定参数
import subprocess
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
import execjs
with open('1_js.js', 'r', encoding='utf-8') as f:
jscode = f.read()
ctx = execjs.compile(jscode)
m = ctx.call('request')
参考博文:
python执行JavaScript代码出现编码问题的解决方案 - 死不悔改奇男子 - 博客园 (cnblogs.com)