通俗来说 如果不想看其他的就直接
在import execjs之前加入以下代码
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')
问题分析
AttributeError: 'NoneType' object has no attribute 'replace'通常出现在尝试对None值调用字符串方法时。在execjs环境下,该错误可能源于子进程输出的编码处理异常。
解决方案
提供的代码通过修改subprocess.Popen的默认编码为utf-8来规避编码问题,但需注意以下实现细节:
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')
import execjs
替代方案
若上述方法无效,可尝试以下其他方法:
检查Node.js环境 确保系统已安装Node.js且版本兼容。通过命令node -v验证,推荐使用LTS版本。
清理execjs运行时缓存
import execjs
execjs.get().runtime.terminate() # 终止现有运行时
ctx = execjs.get().compile("你的JS代码") # 重新初始化
指定编码的完整方案
import subprocess
import execjs
def patch_subprocess():
original_popen = subprocess.Popen
def wrapped_popen(*args, **kwargs):
kwargs['encoding'] = 'utf-8'
kwargs['errors'] = 'ignore' # 添加错误处理
return original_popen(*args, **kwargs)
subprocess.Popen = wrapped_popen
patch_subprocess()
验证步骤
- 创建测试脚本
test_encoding.py:
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')
import execjs
print(execjs.eval("'Hello'.toUpperCase()")) # 应输出"HELLO"
- 若仍报错,检查系统环境变量
NODE_PATH是否指向正确的Node.js安装目录。
2555

被折叠的 条评论
为什么被折叠?



