本人美滋滋写完js代码后,用py的execjs去调用写好的js代码,python命令一敲上,你猜怎么着,报错了,它提示说我什么\ufffd编码问题,这不是unicode编码吗,好好好,检查了下文件的编码,然后把控制台用命令行chcp命令调成一样的utf-8编码
## 将控制台编码改为utf-8
chcp 65001
还报错,啥情况?已经把py文件、js文件和控制台编码改成一样的了。
于是单独对py用python看看能不能输出中文,结果显示是正常的,没问题啊。那问题只能出现在execjs调用js代码上了,然后写了个简易的js去调用,好家伙,真给乱码啊,那问题就出现在execjs。
于是嘎嘎搜,发现是因为execjs库是py2的产物,而py2使用的ASCII编码,并且execjs库其实已经停止更新了。
解决方法:1.需要在execjs库引入之前加上下面代码
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
# import execjs 记得一定要在这个之前引入
2.使用PyExecJS2库代替,剩下代码也是一样的import execjs
pip install PyExecJS2
———————————————————————————————————————————
更新:2024.8.13
发现问题:根据本人需要调用先后两个函数,两个函数都使用到了全局对象的时间戳,并且必须一致,所以本人前一个函数set,后一个函数get。但是发现该库在先后调用函数时,上下文并不一致,每次调用函数好像都在重新解释js了,查了论坛半天也没有结果。(全网都没发现这个问题还是这本身就是PyExecJS库的缺点??)
问题复述:代码如下,原本应该调用三次increment后,输出分别为1,2,3。但结果却为1,1,1,就好像上下文没有生效一样。
import execjs
# 编译 JavaScript 代码并创建一个上下文对象
ctx = execjs.compile("""
var counter = 0;
function increment() {
counter += 1;
return counter;
}
""")
# 在同一个上下文中多次调用 JavaScript 函数
result1 = ctx.call("increment")
print(result1) # 输出: 1
result2 = ctx.call("increment")
print(result2) # 输出: 1
result3 = ctx.call("increment")
print(result3) # 输出: 1
解决方法:抛弃PyExecJS2,使用py_mini_racer(PS:不需要用Node.js时,因为该库不调用Node.js去解释,使用不了require语法的)
1.安装使用py_mini_racer
pip install py_mini_racer
2.调用示例
from py_mini_racer import MiniRacer
ctx = MiniRacer()
jscode = '''var counter = 0;
function increment() {
counter += 1;
return counter;
}'''
ctx.eval(jscode)
result = ctx.call("increment")
print(result) # 输出: 1
result = ctx.call("increment")
print(result) # 输出: 2
result = ctx.call("increment")
print(result) # 输出: 3