Python中PyExecJS的安装、配置与编码问题解决指南

Finn
Finn
发布时间:2026-10-14 | 5人浏览过
原创

本文详细介绍Python中PyExecJS模块的安装与配置方法,对比Node.js、V8等JS运行时环境,重点解决Windows下JScript调用及UTF-8编码导致的UnicodeEncodeError问题,提供实用的代码编写建议。

PyExecJS模块安装与运行时配置

模块安装

安装过程可参考官方文档进行,通常通过pip命令完成。


pip install PyExecJS

配置

该模块依赖于外部的JS运行时环境才能正常工作。

官方测试认可以下JS运行时,建议优先采用:

  • PyV8:这是一个调用Google V8引擎的Python扩展模块。
  • Node.js:本文示例主要采用该运行时环境。
  • PhantomJS:一个无头浏览器环境。
  • Nashorn:Java 8内置的JavaScript引擎。

此外,以下JS运行时虽被支持但未经过官方正式测试:

  • Apple JavaScriptCore:Mac OS X系统内置。
  • JScript:Windows系统自带的JS解释器,即IE浏览器使用的引擎。
  • SlimerJS:基于Firefox的无头浏览器。

需要注意的是,对于PyV8模块,目前网络上仅能找到支持Python 2的安装包,尚不支持Python 3。若直接使用pip安装会报错,即使将pip和setuptools更新至最新版本也无法解决该兼容性问题。

对于选择使用JScript环境的用户,只要确保JS代码在IE浏览器中能正常运行且无报错,即可直接在Python中调用,无需额外安装其他运行时环境。

JS代码编写与编码问题处理

代码编写

在执行JS代码之前,必须先在选定的运行时环境下进行编译处理。

由于该JS执行环境并非完整的浏览器,缺少window、document等浏览器原生对象,也不具备console调试面板,因此在编译依赖这些对象的代码时容易报错。建议在编写JS代码时,尽量将其封装为函数形式,以便通过compile函数方便地被Python调用。


import execjs

name = execjs.get().name # 获取JS的运行时名称,写代码时可不写
ctx = execjs.compile("""
    function add(x, y) {
        return x + y;
     }
""") # 获取代码编译完成后的对象
 ctx.call("add", 1, 2) # 调用js函数add,并传入它的参数
 ctx.eval("add({0}, {1})").format(1,2) # 使用eval的写法同上,但是在传入字符串或者其他类型的数据时需要添加对应的格式,如下所示,具体可在程序中debug
 ctx.eval('add("{0}", "{1}")').format("1","2")

此外,当JS代码片段较长时,可以将其保存为独立的JS文件,以便管理和调用。

由于历史原因,ExecJS早期由Python 2编写,因此在处理文件编码时可能遇到问题。该模块会将JS代码读取到内存,随后将调用代码与JS文件内容一同写入一个临时文件(例如C:\Users\user\AppData\Local\Temp\xx.js)中执行。

如果JS源文件采用UTF-8编码,在写入临时文件时模块可能会抛出UnicodeEncodeError: 'gbk' codec can't encode character xxx 异常。这主要是因为模块在写入文件时默认使用Windows系统的GBK编码,而未指定encoding=utf-8参数。因此,建议将JS源文件保存为GBK编码以规避此错误。


import execjs

with open(r"C:\Users\user\Desktop\security.js", 'r') as f:
    content = f.read() #读取js文件的全部内容到content变量中
ctx = execjs.compile(content)
jscode = 'getkey("{0}","10001","{1}")'.format(username, pubkey)
print(ctx.eval(jscode))

以上即为PyExecJS相关内容的完整介绍,希望对各位的学习有所帮助,也欢迎大家继续支持本站获取更多技术资讯。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表