插件窝 干货文章 Python调用JS函数报错UnicodeEncodeError:如何解决execjs编码问题?

Python调用JS函数报错UnicodeEncodeError:如何解决execjs编码问题?

JavaScript 使用 execjs 调用 306    来源:    2025-03-14

在使用 execjs 库调用 JavaScript 函数时,可能会遇到 UnicodeEncodeError 错误。这通常是由于 Python 和 JavaScript 之间的编码不一致导致的。以下是一些可能的解决方案:

1. 确保 Python 和 JavaScript 的编码一致

确保你的 Python 脚本和 JavaScript 代码使用相同的编码(通常是 UTF-8)。你可以在 Python 脚本的开头添加以下代码来确保编码一致:

# -*- coding: utf-8 -*-

2. 使用 execjscompile 方法

在调用 JavaScript 函数之前,使用 execjscompile 方法将 JavaScript 代码编译为可执行的上下文。这样可以确保编码问题在编译阶段就被处理。

import execjs

# 编译 JavaScript 代码
ctx = execjs.compile("""
    function myFunction() {
        return "Hello, 世界";
    }
""")

# 调用 JavaScript 函数
result = ctx.call("myFunction")
print(result)

3. 使用 execjseval 方法

如果你不需要编译整个 JavaScript 文件,可以直接使用 eval 方法来执行 JavaScript 代码片段。

import execjs

# 直接执行 JavaScript 代码
result = execjs.eval("'Hello, 世界'")
print(result)

4. 使用 subprocess 调用 Node.js

如果你仍然遇到编码问题,可以考虑使用 subprocess 模块直接调用 Node.js 来执行 JavaScript 代码。这样可以避免 execjs 的编码问题。

import subprocess

# 调用 Node.js 执行 JavaScript 代码
result = subprocess.check_output(["node", "-e", "console.log('Hello, 世界')"], encoding="utf-8")
print(result.strip())

5. 检查系统环境变量

确保你的系统环境变量 LANGLC_ALL 设置为 UTF-8 编码。你可以在终端中运行以下命令来检查:

echo $LANG
echo $LC_ALL

如果它们没有设置为 UTF-8,你可以通过以下命令来设置:

export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

6. 使用 PyExecJS 替代 execjs

如果你仍然遇到问题,可以尝试使用 PyExecJS 库,它是 execjs 的一个替代品,可能在某些情况下表现更好。

pip install PyExecJS

然后使用 PyExecJS 来调用 JavaScript 函数:

import PyExecJS

# 编译 JavaScript 代码
ctx = PyExecJS.compile("""
    function myFunction() {
        return "Hello, 世界";
    }
""")

# 调用 JavaScript 函数
result = ctx.call("myFunction")
print(result)

总结

UnicodeEncodeError 错误通常是由于编码不一致导致的。通过确保 Python 和 JavaScript 使用相同的编码、使用 execjscompileeval 方法、或者直接调用 Node.js,你可以解决这个问题。如果问题仍然存在,可以考虑使用 PyExecJS 替代 execjs