踩坑纪实: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
posted @ 2023-03-22 10:55  Jerome12138  阅读(291)  评论(0)    收藏  举报