当我们安装好nodejs环境,想在python代码中去调用JavaScript代码,常常会出现编码的问题。
举个例子:
python代码如下:
点击查看代码
import execjs
f = open("test.js", mode="r", encoding="utf-8")
js_code = f.read() # 读取所有js代码
f.close()
js_exec = execjs.compile(js_code) # 加载代码
\# 用js_exec去执行js代码中的函数
\# call(函数,参数1,参数2,...)
r2 = js_exec.call("gn")
print(r2)
JavaScript代码如下:
点击查看代码
function gn() {
return "苹果——香蕉——桃子——西瓜".split("——")
}
当我们运行python代码的时候,会出现下述报错。
![](https://img2024.cnblogs.com/blog/3369335/202402/3369335-20240229151604046-1634069811.png)
报错信息为“NoneType”对象没有replace方法,定位到的语句是`r2 = js_exec.call("gn")`,也就是在调用gn函数的时候发生了错误。在往上看,有解码错误。这里的关键点就是解码出现了问题。这里就得讲一下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")
上述代码就可以在引入execjs库之前将Popen的字符串设置为utf-8。再次运行代码,成功执行。
![](https://img2024.cnblogs.com/blog/3369335/202402/3369335-20240229153304793-707830618.png)