踩坑纪实:UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 21-22: invalid continuation byte
问题出现过程
切换新的服务器之后,使用PyExecJS库报错
...
ctx = execjs.compile(js_str)
version_obj = ctx.eval('exportObj')
报错内容:
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 21-22: invalid continuation byte
解决办法
1. 如果是windows环境下,需要对subprocess.Popen
做重定义,固定编解码方式:
``` python
# start 加这段代码在import execjs之前,修改编码方式,避免windows环境下中文乱码使用execjs报错
import sys
import subprocess
from functools import partial
if sys.platform == 'win32':
# 只在windows环境下修改,linux下会报错
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
# end
```
- 建议直接加在djanbo的setting文件中,如果仅加在某个文件中,某些情况下可能还是会报错
2. 如果是linux环境下,不会是windows编码问题,一般都是js执行环境问题
python中通过以下命令可以指定execjs的运行环境:
`os.environ["EXECJS_RUNTIME"] = "JScript"`
`os.environ["EXECJS_RUNTIME"] = "Node"`
设置完成之后,通过execjs.get().name
可以获取执行环境,检查是否设置成功:
```
>>> import execjs
>>> execjs.get().name
'SpiderMonkey'
# 设置完成之后,可以检查是否设置成功:
>>> os.environ["EXECJS_RUNTIME"] = "Node"
>>> execjs.get().name
'Node.js (V8)'
```
- ps: 如果没有执行成功,请检查服务器中是否有安装nodejs