execjs报错“UnicodeEncodeError: 'gbk' codec can't encode character '\x..' in posit”

394 阅读1分钟

问题描述

在使用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)