我要做你的女王 發表於 2024-2-29 15:34:00

python执行JavaScript代码出现编码问题的解决方案

<p>当我们安装好nodejs环境,想在python代码中去调用JavaScript代码,常常会出现编码的问题。<br>
举个例子:<br>
python代码如下:</p>
<details>
<summary>点击查看代码</summary>
<pre><code>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)
</code></pre>
</details>
JavaScript代码如下:
<details>
<summary>点击查看代码</summary>
<pre><code>function gn() {
    return "苹果——香蕉——桃子——西瓜".split("——")
}
</code></pre>
</details>
当我们运行python代码的时候,会出现下述报错。
<p><img src="https://img2024.cnblogs.com/blog/3369335/202506/3369335-20250607093841143-1121079793.png"></p>
<p>报错信息为“NoneType”对象没有replace方法,定位到的语句是<code>r2 = js_exec.call("gn")</code>,也就是在调用gn函数的时候发生了错误。在往上看,有解码错误。这里的关键点就是解码出现了问题。这里就得讲一下execjs库的执行逻辑。<br>
<code>execjs库的底层是通过Popen函数来调用nodejs的环境来运行JavaScript代码的,也就相当于在cmd命令框中输入node xxx.js来执行。windows系统的cmd命令框默认是gbk编码的,但是在pycharm中设置的默认编码为utf-8,所以就会出现两边编码不一致导致的解码问题</code><br>
解决上述问题的方案:只需要把Popen的字符集设置成utf-8即可,但这个必须在引入execjs库之前就锁定Popen的字符集。<br>
具体做法如下:<br>
在引入execjs库之前,加入如下代码</p>
<details>
<summary>点击查看代码</summary>
<pre><code>from functools import partial   # 锁定参数
import subprocess

subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
</code></pre>
</details>
上述代码就可以在引入execjs库之前将Popen的字符串设置为utf-8。再次运行代码,成功执行。
<p><img src="https://img2024.cnblogs.com/blog/3369335/202402/3369335-20240229153304793-707830618.png"></p><br><br>
来源:https://www.cnblogs.com/sbhglqy/p/18044384
頁: [1]
查看完整版本: python执行JavaScript代码出现编码问题的解决方案