当前位置: 首页 > ai >正文

execjs执行js报错, subprocess.py编码问题

文章目录

    • 起因
    • 报错
    • 问题关键
    • 两种解决办法
      • 第一种,治标,不治本
      • 第二种,治标,又治本
        • Ctrl+F
        • Create new Popen instance.
        • utf-8
        • OK

起因

在这里插入图片描述

import execjs  # 导入# 生成JavaScript运行环境,环境名可以指定
node = execjs.get()  # 安装nodejs后,会得到运行环境名为:Node.js (V8)
print(node)# JavaScript中表达式(字符串字面量, 数字字面量, 算术表达式)会自动返回其值
print(execjs.eval('"宇宙第一小趴菜"'))
# print(execjs.eval('3.14'))
# print(execjs.eval('18'))
# print(execjs.eval('3+5'))

报错

在这里插入图片描述

ExternalRuntime(Node.js (V8))
Exception in thread Thread-1:
Traceback (most recent call last):File "D:\miniconda3\envs\spider_base\lib\threading.py", line 980, in _bootstrap_innerself.run()File "D:\miniconda3\envs\spider_base\lib\threading.py", line 917, in runself._target(*self._args, **self._kwargs)File "D:\miniconda3\envs\spider_base\lib\subprocess.py", line 1495, in _readerthreadbuffer.append(fh.read())
UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 16: illegal multibyte sequence
Traceback (most recent call last):File "D:\JsSpiderCode\02 常见加密算法\01 execjs使用.py", line 8, in <module>print(execjs.eval('"宇宙第一小趴菜"'))File "D:\miniconda3\envs\spider_base\lib\site-packages\execjs\__init__.py", line 51, in evalreturn get().eval(source, cwd)File "D:\miniconda3\envs\spider_base\lib\site-packages\execjs\_abstract_runtime.py", line 25, in evalreturn self.compile('', cwd=cwd).eval(source)File "D:\miniconda3\envs\spider_base\lib\site-packages\execjs\_abstract_runtime_context.py", line 27, in evalreturn self._eval(source)File "D:\miniconda3\envs\spider_base\lib\site-packages\execjs\_external_runtime.py", line 78, in _evalreturn self.exec_(code)File "D:\miniconda3\envs\spider_base\lib\site-packages\execjs\_abstract_runtime_context.py", line 18, in exec_return self._exec_(source)File "D:\miniconda3\envs\spider_base\lib\site-packages\execjs\_external_runtime.py", line 88, in _exec_return self._extract_result(output)File "D:\miniconda3\envs\spider_base\lib\site-packages\execjs\_external_runtime.py", line 156, in _extract_resultoutput = output.replace("\r\n", "\n").replace("\r", "\n")
AttributeError: 'NoneType' object has no attribute 'replace'

问题关键

在这里插入图片描述
默认情况下在使用pyexecjs指定编译的时候, 会引用subprocess.py, 此文件默认使用的编码是系统编码, 从而引发报错

两种解决办法

第一种,治标,不治本

在调用 import execjs之前修改 subprocess.py 编码为utf-8

import subprocess
from functools import partial# 重新定义 subprocess.Popen,设置默认编码为 utf-8
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")

在这里插入图片描述

import subprocess
from functools import partial# 重新定义 subprocess.Popen,设置默认编码为 utf-8
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")import execjs  # 导入# 生成JavaScript运行环境,环境名可以指定
node = execjs.get()  # 安装nodejs后,会得到运行环境名为:Node.js (V8)
print(node)# JavaScript中表达式(字符串字面量, 数字字面量, 算术表达式)会自动返回其值
print(execjs.eval('"宇宙第一小趴菜"'))
print(execjs.eval('3.14'))
print(execjs.eval('Boolean("True")'))
print(execjs.eval('18'))
print(execjs.eval('3+5'))

第二种,治标,又治本

在这里插入图片描述进入到 subprocess.py

D:\miniconda3\envs\spider_base\lib\subprocess.py
Ctrl+F

在这里插入图片描述

Create new Popen instance.
"""Create new Popen instance."""

在这里插入图片描述

utf-8

在这里插入图片描述
在这里插入图片描述

OK

在这里插入图片描述

import execjs  # 导入# 生成JavaScript运行环境,环境名可以指定
node = execjs.get()  # 安装nodejs后,会得到运行环境名为:Node.js (V8)
print(node)# JavaScript中表达式(字符串字面量, 数字字面量, 算术表达式)会自动返回其值
print(execjs.eval('"宇宙第一小趴菜"'))
print(execjs.eval('3.14'))
print(execjs.eval('Boolean("True")'))
print(execjs.eval('18'))
print(execjs.eval('3+5'))
http://www.xdnf.cn/news/17507.html

相关文章:

  • Ignite端口管理组件GridPortProcessor全解析
  • Linux系统编程——基础IO
  • 《录井管理与工程》书籍第一章要点及相应思考
  • 虚幻GAS底层原理解剖十 (网络)
  • 深度剖析 Linux 信号:从基础概念到高级应用,全面解析其在进程管理与系统交互中的核心作用与底层运行机制
  • Orange的运维学习日记--39.Nginx详解与服务部署
  • 【liunx】web高可用---nginx
  • GSON 框架下百度天气 JSON 数据转 JavaBean 的实战攻略
  • ZooKeeper和Reids做分布式锁的区别?
  • Notepad--:国产跨平台文本编辑器,Notepad++ 的理想替代方案
  • 车载软件架构 --- 车辆量产后怎么刷写Flash Bootloader
  • 【数据结构入门】二叉树(1)
  • Redis7 GEO功能介绍与电商场景案例解析
  • Android模块化架构深度解析:从设计到实践
  • HTML5中华美食网站源码
  • (Arxiv-2025)Phantom-Data:迈向通用的主体一致性视频生成数据集
  • LangChain框架之 invoke() 方法
  • 【SpringBoot】02 基础入门-什么是Spring Boot?:Spring与SpringBoot
  • CLIP在文生图模型中的应用
  • Unity笔记(五)知识补充——场景切换、退出游戏、鼠标隐藏锁定、随机数、委托
  • redis笔记(二)
  • 深入解析游戏引擎(OGRE引擎)通用属性系统:基于Any类的类型安全动态属性设计
  • 《深度剖析前端框架中错误边界:异常处理的基石与进阶》
  • Rust 实战五 | 配置 Tauri 应用图标及解决 exe 被识别为威胁的问题
  • 麒麟系统使用-PATH设置
  • 【96页PPT】华为IPD流程管理详细版(附下载方式)
  • 34-Hive SQL DML语法之查询数据-3
  • 游戏盾是什么?
  • Vibe Coding 自然语言驱动 AI 编程方式
  • 在Linux中部署tomcat